【发布时间】:2020-12-29 20:22:47
【问题描述】:
我试图了解框架的默认实现如何设法拥有 itemssource 项的数据上下文。具体来说,当设置了 DataGrid 的 ItemsSource(例如设置为 Foo 对象的集合)并且您在 DataGrid.Columns 属性中定义列时,DataGridTextColumn “Binding”属性需要来自 Foo 对象的属性。
以下代码可能更好地说明问题:
public class MainWindowViewModel
{
public List<Foo> Foos { get; }
}
public class Foo
{
public string FooDesignation { get; }
}
我非常简单的视图模型包含我的 DataGrid 的集合。然后我希望使用我自己的自定义列添加到 DataGrid 的列集合中:
public class CustomDataGridTextColumn : DataGridTextColumn
{
public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
nameof(Text),
typeof(string),
typeof(CustomDataGridTextColumn),
new PropertyMetadata(default(string)));
public string Text
{
get => (string) this.GetValue(TextProperty);
set => this.SetValue(TextProperty, value);
}
private Binding _textBinding;
public Binding TextBinding
{
get => _textBinding;
set => _textBinding = value;
}
生成的 XAML 如下所示(在 MainWindowView 中,数据上下文设置为 MainWindowViewModel 的实例)
<d:Window.DataContext>
<x:Type Type="local:MainWindowViewModel" />
</d:Window.DataContext>
<Grid>
<DataGrid ItemsSource="{Binding Foos}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding FooDesignation}" />
<local:CustomDataGridTextColumn Text="{Binding FooDesignation}" TextBinding="{Binding FooDesignation}" />
</DataGrid.Columns>
</DataGrid>
</Grid>
DataGridTextColumn 的 Binding 属性可以毫无问题地绑定到 Foo (FooDesignation) 的属性,intellisense 也将此属性显示为一个选项。
我自己的 CustomDataGridTextColumn 的 Text 和 TextBinding 属性在绑定到同一个 FooDesignation 属性时会显示设计时和运行时错误。 Intellisense 向我展示了我的 MainWindowViewModel 的 Foos 属性作为选项(这很有意义,因为它显然没有继承 Foo 对象数据上下文)。
我的假设是它与 DataGridTextColumn 的 Binding 属性属于 Binding 类型这一事实有关,并且被配置为以某种方式运行可以。
我无法找到/理解这是如何实现的。任何人都可以对此有所了解吗?我的目标是让 Text/*TextBinding 属性的行为与 Binding 属性相同。
【问题讨论】:
标签: c# wpf xaml data-binding user-controls