2

我面临一个奇怪的问题。我有一个DataGrid我想绑定ItemsSourceMultiBinding原因。虽然使用简单绑定到 aDataTable效果很好,但我无法让它与多重绑定一起使用。

简单地说:下面的标记工作并呈现数据表

<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实现IValueConverterIMultiValueConverter并简单地传递值

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. 此外,调试证明在这两种情况下转换器都返回了正确的值。

你知道这是怎么回事吗?

谢谢!

4

1 回答 1

2

首先,DataTable没有实现IEnumerable,所以它不是属性的有效值DataGrid.ItemsSource。您可以在输出窗口中观察到一个System.Windows.Data Error: 5这样的说法。

其次,您可以轻松地检查DataGrid.ItemsSource绑定到 a 时的最终值DataTable是否实际上是一个DataView对象(准确地说是DataTable.DefaultView属性的值)。

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

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

至于如何解释它在不使用时如何自动工作,MultiBinding或者为什么在使用时不是这样 - 我不知道。我认为这是 WPF 的类型转换机制,但默认转换器既不是 forDataTable也不是 forIEnumerable能够执行转换,所以我想不是这样的。可能这个Binding班级有一些特殊的能力,而MultiBinding不是。

于 2016-06-05T08:29:51.687 回答