将额外列添加到不在集合中的WPF DataGrid

时间:2015-07-22 12:28:23

标签: wpf binding datagrid datatable

我正在使用DataGrid控件来显示DataTable的内容。因此,数据表被设置为DataGrid的ItemsSource。

DataGrid的以下列表示数据表的列:

类型,名称,域,子域

现在,名为“Properties”的动态列应包含特定信息,具体取决于“Type”列的值。 像这样:

switch (Type)
    case ABC:   content="row.Field1"
    case DEF:   content="row.Field2"
    case XYZ:   content="row.FieldX"

其中Field1 .. FieldX是数据表中的所有列。 我目前正在使用DataGrid和BindingListCollectionView。 如果解决方案能在此基础上建立,那就最好了。

我尝试使用多值绑定和多值转换器,但我希望有更多的自由,而不必预先选择字段:

var bind = new MultiBinding();

bind.Bindings.Add(new Binding("Protocol"));
bind.Bindings.Add(new Binding("Path1"));
bind.Bindings.Add(new Binding("Path2"));
bind.Bindings.Add(new Binding("Path3"));
bind.Bindings.Add(new Binding("Path4"));

bind.Converter = _ConfigurationMultiValueConverter;

col.Binding = bind;

1 个答案:

答案 0 :(得分:1)

你可以使用类似的东西。当然这只是一个例子。

public class YourClass
{
    public YourType Protocol;
    public YourType2 Path1;
    public YourType3 Path2;
    public YourType4 Path3;
    public YourType5 Path4;
    public int ChooseExpression;
    public YourType6 Field1;
    public YourType7 Field3;
    public YourType8 FieldX;
}

然后在你的DataGrid中

<DataGrid Name="IfYouNeedAName" AutoGennerateColumn="False" ItemsSource={Binding YourClass} >
    <DataGrid.Columns>
        <DataGridTextColumn Header="ProtocolHeader" Binding={Binding Protocol} />
        <DataGridTextColumn Header="Path1Header" Binding={Binding Path1} />
        ...
        <DataGridTextColumn Header="TheChoosenOne" Binding={Binding YourClass, YourBindingConverer} />
    </DataGrid.Columns>
</DataGrid>

最后转换器,由IValueConverter继承

public class YourBindingConverer : IValueConverter
{
    public object Convert(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        switch(value.ChooseExpression)
            case 1: return Field1.ToString();
            case 2: return Field3.ToString();
            case 3: return FieldX.ToString();
        else
            return string.Empty;
        end;
    }

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

我是从记忆中写下来的,因为我这里没有VS.但我想,它可能是那样的。 如果您有更多问题,请随时提出。

对于奖金,here是价值转换器的理想解决方案。