@cicatrix
было бы большой ошибкой думать

Как передать тип связанного элемента в преобразователь (конвертер)?

Здравствуйте!

Есть DataGrid, источник данных для которого меняется в ходе исполнения. Код для иллюстрации:
// Один из типов
public class Foo
{
   public string Id {get; set;}
   public string Data {get; set;}
}

// Другой тип с другим набором полей и их типов
public class Bar
{
   public int Code {get; set;}
   public string OtherData {get; set;}
}

// Позже...
// Имеем два (или более) различных источников данных для одного и того же DataGrid
List<Foo> fooList = new List<Foo> { new Foo() { Id="ABC", Data = "data1" }}
List<Bar> barList = new List<Bar> { new Bar() { Code=3, OtherData = "data2" }}

// Переключаем источники
if (condition)
    this.dgDisplay.ItemsSource = fooList;
else
    this.dgDisplay.ItemsSource = barList;


Теперь в XAML мне нужно передать не только наименование свойства в Converter, но и тип используемых в настоящее время данных (Foo или Bar) из примера выше.
То есть в коде XAML имею такой фрагмент:
<DataGrid.ColumnHeaderStyle>
    <Style TargetType="DataGridColumnHeader">
        <Setter Property="Content" Value="{Binding ConverterParameter=????, Converter={StaticResource PropertyDescriptionConverter}}" />
    </Style>
</DataGrid.ColumnHeaderStyle>


Вопрос - как передать в Converter тип (Foo или Bar), вместе с именем свойства?
  • Вопрос задан
  • 59 просмотров
Пригласить эксперта
Ответы на вопрос 1
@cicatrix Автор вопроса
было бы большой ошибкой думать
Кому интересно будет - задолбался я с этими байндингами и решил "в лоб" через событие AutoGeneratingColumn(:

private void DgRefTable_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    DataGrid dg = (DataGrid)sender;
    object src = dg.ItemsSource;
    Type type = src.GetType().BaseType.GetGenericArguments()[0];
    PropertyInfo property = type.GetProperty(e.Column.Header.ToString(), BindingFlags.Public | BindingFlags.Instance);
    if (property.IsDefined(typeof(RTFieldAttribute), true))
    {
        e.Column.Header = ((RTFieldAttribute)property.GetCustomAttributes(typeof(RTFieldAttribute), true)[0]).HeaderText;
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы