3

我有一个绑定到对象 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 中添加了一个组合框。

<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();

我的每一行都需要不同的 Unit 组合框值。例如,第 1 行需要“kg, gm”,第 2 行需要“meter, cm, feet”,第 3 行需要“ltr, ml, ton”,第 4 行需要为空白。

如何设置这些值?我认为在每行创建时,我都可以创建一个 List 并将其作为 itemsource 分配给复选框。但是在上面的代码中这怎么可能。每行复选框的复选框 Itemsource ???

4

1 回答 1

2

我建议使用 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

编辑 根据您的评论:您可以将转换器添加到数据模板可见的任何地方,我直接添加到数据模板只是为了演示:

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

“本地”必须指向您的 DynamicValuesConverter 命名空间。

于 2013-08-27T11:14:25.567 回答