我面临一个奇怪的问题。我有DataGrid
我希望ItemsSource
与MultiBinding
绑定DataTable
是有原因的。虽然使用与<DataGrid Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" AutoGenerateColumns="True" IsReadOnly="True">
<DataGrid.ItemsSource>
<Binding Path="Mock.Value" Converter="{StaticResource CollectionToDataTableConverter}"></Binding>
</DataGrid.ItemsSource>
</DataGrid>
的简单绑定很有效,但我无法使用多绑定。
简单地说:下面的标记工作并呈现数据表
<DataGrid Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" AutoGenerateColumns="True" IsReadOnly="True">
<DataGrid.ItemsSource>
<MultiBinding Converter="{StaticResource CollectionToDataTableConverter}">
<Binding Path="Mock.Value" />
</MultiBinding>
</DataGrid.ItemsSource>
</DataGrid>
...虽然这不起作用 - 什么都不做
CollectionToDataTableConverter
请注意,IValueConverter
同时实现了IMultiValueConverter
和public class CollectionToDataTableConverter : IMultiValueConverter, IValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values?.FirstOrDefault();
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value;
}
// ...
}
,只是传递了值
Mock.Value
当然,DataTable
属性存在于视图模型上,并且是一个简单的Request URL:https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-57N00510UU258144B&useraction=commit
。此外,调试证明在两种情况下转换器都返回正确的值。
你知道这是怎么回事吗?
谢谢!
答案 0 :(得分:2)
首先,DataTable
未实现IEnumerable
,因此它不是DataGrid.ItemsSource
属性的有效值。您可以在输出窗口中观察到System.Windows.Data Error: 5
只是说明了这一点。
其次,您可以轻松检查绑定到DataGrid.ItemsSource
时DataTable
的最终值是否为DataView
对象(恰好是DataTable.DefaultView
属性的值)
现在有几种方法可以使MultiBinding
工作 - 这里有几个:
DataTable.DefaultView
而不是DataTable
DataTable.DefaultView
(使用Mock.Value.DefaultView
作为绑定路径)DataTable
的类并实现IEnumerable
(在DefaultView.GetEnumerator()
实现中返回GetEnumerator
),并使用该类而不是DataTable
关于自动如何在不使用MultiBinding
时工作的解释,或为什么在使用时不是这种情况 - 我不知道。我认为这是WPF的类型转换机制,但DataTable
和IEnumerable
的默认转换器都无法执行转换,所以我想不是这样。可能Binding
类具有MultiBinding
没有的特殊功能。