在不同的行中添加具有不同值的DataGrid checkboxcolumn

时间:2013-08-27 10:43:29

标签: c# wpf datagrid combobox itemsource

我有一个绑定到对象PlacementData(PD)的DataGrid。 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中,我在DataTemplateColumn中添加了一个Combobox。

<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>

在窗口开始时,我将itemsource设置为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();

我的每一行都需要不同的单位组合框值。例如,1行需要“kg,gm”,第2行需要“米,厘米,英尺”,第3行需要“ltr,ml,ton”,&amp;第四个需要它是空白的。

如何设置这些值?我想在每一行创建时,我都可以创建一个List并将其作为itemsource分配给复选框。但是在上面的代码中如何实现这一点。复选框的每一行的复选框项目源???

1 个答案:

答案 0 :(得分:2)

我建议使用EditCellTemplate,但这取决于您和任务要求。 在DataTemplate的组合框中使用自定义IValueConverter(我使用了PlacementHeader作为dependand属性,你可以使用实际需要的东西或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

修改 根据您的评论:您可以将转换器添加到数据模板可见的任何位置我直接添加到datatemplate只是为了演示:

                    <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 namesapce。