Добавить столбец флажка DataGrid с разными значениями в разных строках

У меня есть DataGrid, привязанный к объекту PlacementData (PD). ПД имеет свойство "P_Unit".

 public class PlacementData 
 {
    public bool PIsChecked { get; set; }
    public string PlacementHeader { get; set; }
    public string P_NumberOfCases { get; set; }
    public int P_Value1 { get; set; }
    public int P_Value2 { get; set; }
    public int P_Value3 { get; set; }
    public int P_Value4 { get; set; }
    public int P_Value5 { get; set; }
    public string P_Unit { get; set; }
}

В моем DataGrid я добавил Combobox в DataTemplateColumn.

<DataGridTemplateColumn x:Name="UnitColumn1" Header="Unit" MinWidth="80" >
     <DataGridTemplateColumn.CellTemplate>
           <DataTemplate>
                  <ComboBox Text="{Binding P_Unit}">
                         <ComboBoxItem Content="kg/m3" IsSelected="True"/>
                         <ComboBoxItem Content="gm/cm3"/>
                  </ComboBox>
            </DataTemplate>
      </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

В начале окна я установил источник элементов с 4 строками с добавленными заголовками.

    private List<PlacementData> datagrid1CollectionData()
    {
        List<PlacementData> authors = new List<PlacementData>();

        authors.Add(new PlacementData()
        {
            PlacementHeader = "Based On Injection Rate",

        });
        authors.Add(new PlacementData()
        {
            PlacementHeader = "Based On Viscosity"
        });
        authors.Add(new PlacementData()
        {
            PlacementHeader = "Based On Sheer Thinning"
        });
        authors.Add(new PlacementData()
        {
            PlacementHeader = "k"
        });


        return authors;
    }

    dataGrid1.ItemsSource = datagrid1CollectionData();

Каждой моей строке нужны разные значения для поля со списком Unit. Например, 1-я строка требует «кг, гм», 2-я — «метр, см, фут», 3-я — «л, мл, тонна», 4-я — пустая.

Как установить эти значения? Я думаю, что при создании каждой строки я могу создать список и назначить его флажку в качестве источника элемента. Но как это возможно в приведенном выше коде. Флажок Itemsource для каждой строки флажка ???


person Tvd    schedule 27.08.2013    source источник
comment
Как узнать, какую единицу использовать в каждом случае? Где хранится эта информация?   -  person Nikita B    schedule 27.08.2013
comment
@NikitaBrizhak, вы видите, что метод datagrid1CollectionData() вызывается в событии Window_Loaded, и добавляется значение заголовка каждой строки. Я знаю серию заголовка и, следовательно, знаю, какие элементы Unit будут находиться в поле со списком какой строки.   -  person Tvd    schedule 27.08.2013


Ответы (1)


Я бы рекомендовал использовать EditCellTemplate, но это зависит от вас и требований задачи. В поле со списком в DataTemplate используйте пользовательский IValueConverter (я использовал PlacementHeader в качестве зависимого свойства, вы можете использовать то, что действительно нужно, или сам PlacementData):

 <ComboBox SelectedValue ="{Binding P_Unit}" ItemsSource="{Binding PlacementHeader, Converter={StaticResource DependedValuesConverter}}">
                  </ComboBox>

и некоторый образец конвертера, как идея:

    public class DynamicValuesConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value != null)
            switch (value.ToString())
            {
                case "Based On Injection Rate":
                    return new[] { "kg/m3", "gm/cm3" };
                case "Based On Viscosity":
                    return new[] { "some other..." };
            }
        return new string[0];
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Чтобы реализовать множественный выбор в поле со списком, вы можете использовать CheckComboBox с открытым исходным кодом.

EDIT Согласно вашему комментарию: вы можете добавить преобразователь в любом месте, где он виден, в шаблон данных, который я добавил непосредственно в шаблон данных, чтобы продемонстрировать:

                    <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <DataTemplate.Resources>
                            <local:DynamicValuesConverter x:Key="DependedValuesConverter" />
                        </DataTemplate.Resources>
                        <ComboBox SelectedValue="{Binding P_Unit}" ItemsSource="{Binding PlacementHeader, Converter={StaticResource DependedValuesConverter}}"></ComboBox>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>

"local" должен указывать на вашу область имен DynamicValuesConverter.

person vitaliy zadorozhnyy    schedule 27.08.2013
comment
Как добавить статический ресурс в мой UserControl? Я могу добавить ‹USerControl.Resources›, но не имею доступа к ‹local›. Как добавить статический ресурс конвертера классов. Кстати, в выпадающем списке вы написали DependedValues.... и имя класса DynamicValues..., это ошибка или я чего-то не понимаю. - person Tvd; 27.08.2013
comment
Пожалуйста, посмотрите последнее редактирование оригинального поста, как добавить конвертер. - person vitaliy zadorozhnyy; 27.08.2013
comment
Это работает. Как я могу сделать 1-й элемент выбранным для добавленных? А для тех, которые пусты, можно ли его отключить или около того, чтобы выпадающий список пустых не отображался. - person Tvd; 27.08.2013
comment
1-я строка получила значение единицы, а 2-я строка не получила? Значение для P_Unit 2-й строки было нулевым. ??? - person Tvd; 27.08.2013
comment
На самом деле, он работает правильно, но если я открою пустое поле «Единица» и щелкну в любом месте пустого списка, это нарушится. Экран перемещается вверх и вниз, и это удаляет единицу последней выбранной строки. Когда я не открывал пустую коробку, все отлично сохранилось. - person Tvd; 27.08.2013