我正在使用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;
答案 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是价值转换器的理想解决方案。