繁体   English   中英

ItemsControl.ItemsSource 如何从没有实现 IEnumerable 的东西绑定?

[英]How does ItemsControl.ItemsSource bind from something that doesn't implement IEnumerable?

ItemsControl.ItemsSourceIEnumerable DataTable不是IEnumerable 我希望DataTable无法绑定到ItemsSource 然而,下面的代码有效。 为什么?

<DataGrid ItemsSource="{Binding Table}"/>

public MainWindow()
{
    InitializeComponent();
    DataContext = this;
}

public DataTable Table { get; set; } = new DataTable();

当我在没有绑定的情况下将ItemsSource设置为DataTable ,它会像我预期的那样失败。 但是,将DataTableIEnumerable<DataRowView>编译时不会出错。

new DataGrid().ItemsSource = new DataTable(); // Cannot implicitly convert type 'System.Data.DataTable' to 'System.Collections.IEnumerable'. An explicit conversion exists (are you missing a cast?)
new DataGrid().ItemsSource = (IEnumerable<DataRowView>)new DataTable(); // compiles without error

绑定是否将DataTableIEnumerable<DataRowView> 这种行为的文档在哪里? 我希望ItemsSource文档能够解释这种转换,但我在那里什么也没看到。

首先,转换为IEnumerable<DataRowView>不起作用。 它编译,但会在运行时抛出: 在此处输入图片说明

绑定适用于DataTable因为它实现了IListSource

此接口在 WPF DefaultValueConverter明确说明

// special case for converting IListSource to IList
if (typeof(IListSource).IsAssignableFrom(sourceType) &&
                targetType.IsAssignableFrom(typeof(IList)))
{
    return new ListSourceConverter();
}

并且默认转换器是使用绑定创建的

IValueConverter converter = Engine.GetDefaultValueConverter(type, TargetProperty.PropertyType, IsReflective);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM