WPF DataGrid - Назначение DataContext для строки - PullRequest
1 голос
/ 11 января 2012

У меня есть ситуация, когда свойство ItemsSource объекта DataGrid представляет собой массив целых чисел. Эти целые числа являются ключами к соответствующему словарю. В столбцах нужно отображать поля, которые являются членами объектов значений словаря.

<DataGrid ItemsSource="{Binding Path=thisDataContext, ElementName=control, Mode=OneWay}" 
          AutoGenerateColumns="False">                                                
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Width="0.3*" Binding="{Binding Converter={StaticResource IntToPersonConverter}, Mode=OneWay }"  />
        <DataGridTextColumn Header="Department" Width="0.3*" Binding="{Binding Path=DepartmentIDX, Converter={StaticResource DepartmentConverter}, Mode=OneWay }" />
        <DataGridTextColumn Header="Position" Width="0.3*" Binding="{Binding Path=EmployeeTypeIDX, Converter={StaticResource EmployeeTypeConverter}, Mode=OneWay }" />
    </DataGrid.Columns>     
</DataGrid>

У объекта класса Person, с которым я работаю, есть Properties - идентификаторы Department и Position, поэтому я реализовал несколько конвертеров - Person to Department name и Person to Postition. Я понятия не имею, как объединить их все. Я думал, что это было бы возможно, если бы я мог установить свойства DataContext для строк DataGrid. Так что я могу передать объект Person конвертеру.

Ответы [ 2 ]

2 голосов
/ 11 января 2012

Если коллекция элементов представляет собой список ключей в словаре, вам потребуется написать преобразователь, который преобразует первые ключи словаря в значения словаря, то есть объекты Person и вторые объекты Person, в значения свойств Person.Для этого конвертер должен иметь доступ к словарю.К счастью, есть способ передать дополнительный параметр преобразователю значений WPF, а именно параметр преобразователя в методах Convert и ConvertBack.Здесь вы можете передать объект словаря, и ваш метод Convert может выглядеть следующим образом:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    IDictionary<int, Person> dict = parameter as IDictionary<int, Person>;
    if (dict != null && value is int)
    {
        Person p = dict[(int)value];
        return p.SomeProperty;
    }
}

Передача параметра преобразователя выполняется с помощью свойства ConverterParameter привязки.

1 голос
/ 12 января 2012

Нет особого смысла использовать фьючерсы WPF, такие как конвертеры связывания и т. Д., Просто для того, чтобы доказать, что они работают - они делают.Количество обращений к конвертеру будет огромным, что, по крайней мере, не элегантно, и его легко избежать.Я бы посоветовал вам предварительно обработать вашу коллекцию перед установкой сеточного элемента ItemsSource.

Я бы лично использовал проекции LINQ и устанавливал словари в качестве статических членов вашего класса.Напишите нам, и я выложу образец.

Обновление 1 - Пример кода

public class Person
    {
        private static Dictionary<int, string> Departments;

        static Person()
        {
            Person.SetUpDictionaries();
        }

        private static void SetUpDictionaries()
        {
            Person.Departments = new Dictionary<int, string>(3)
            {
                { 1, "IT" },
                { 1, "Finance" },
                { 1, "HR" }
            };
        }

        public int DepartmentId
        {
            get;
            set;
        }

        public string Depratment
        {
            get { return Person.Departments[this.DepartmentId]; }
        }
    }
...