无法使用多绑定绑定DataGrid ItemsSource - 简单绑定工作正常

时间:2016-06-04 22:37:20

标签: c# wpf datagrid multibinding imultivalueconverter

我面临一个奇怪的问题。我有DataGrid我希望ItemsSourceMultiBinding绑定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同时实现了IMultiValueConverterpublic 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 。此外,调试证明在两种情况下转换器都返回正确的值。

你知道这是怎么回事吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

首先,DataTable未实现IEnumerable,因此它不是DataGrid.ItemsSource属性的有效值。您可以在输出窗口中观察到System.Windows.Data Error: 5只是说明了这一点。

其次,您可以轻松检查绑定到DataGrid.ItemsSourceDataTable的最终值是否为DataView对象(恰好是DataTable.DefaultView属性的值)

现在有几种方法可以使MultiBinding工作 - 这里有几个:

  • 在转换器
  • 中返回DataTable.DefaultView而不是DataTable
  • 直接绑定到DataTable.DefaultView(使用Mock.Value.DefaultView作为绑定路径)
  • 创建一个派生自DataTable的类并实现IEnumerable(在DefaultView.GetEnumerator()实现中返回GetEnumerator),并使用该类而不是DataTable

关于自动如何在不使用MultiBinding时工作的解释,或为什么在使用时不是这种情况 - 我不知道。我认为这是WPF的类型转换机制,但DataTableIEnumerable的默认转换器都无法执行转换,所以我想不是这样。可能Binding类具有MultiBinding没有的特殊功能。