我遇到了 DependencyProperty 的问题。我不能将我的 DependencyProperty 设置为除了我在DependencyProperty.Register(...)
我有一个包含 DataGrid 的 UserControl。UserControl 有一个接受业务对象集合的 DependencyProperty。我希望通过我的 DependencyProperty 设置 UserControl 中 DataGrid 的 ItemsSource。
我的 UserControl.xaml 中的 DataGrid 是:
<DataGrid ItemsSource="{Binding Rows}" AutoGenerateColumns="True" />
我的 UserControl.xaml.cs 代码是:
public MyGrid()
{
InitializeComponent();
this.DataContext = this;
}
public BObjectCollection Rows
{
get { return (BObjectCollection)GetValue(RowsCustomProperty); /* never gets called */ }
set { SetValue(RowsCustomProperty, value); /* never gets called */ }
}
public static DependencyProperty RowsCustomProperty = DependencyProperty.Register("Rows", typeof(BObjectCollection), typeof(MyGrid), new PropertyMetadata(new BObjectCollection(), RowsChanged, RowsCoerce));
private static void RowsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MyGrid tab = (MyGrid)d; //never gets called
}
private static object RowsCoerce(DependencyObject d, object value)
{
MyGrid tab = (MyGrid)d;
BObjectCollection newValue = (BObjectCollection)value;
return newValue;
}
我有一个包含一个 UserControl 的 MainWindow,并将控件的 DependencyProperty 设置为 BObjectCollection(它扩展了 BindingList)。MainWindow.xaml 代码很简单:
<local:MyGrid Rows="{Binding Rows}" />
我的 MainWindow.xaml.cs 是:
public MainWindow()
{
this._rows = new BObjectCollection();
this._rows.Add(new BObject("AAA", 10));
this._rows.Add(new BObject("BBB", 20));
this._rows.Add(new BObject("CCC", 30));
this.DataContext = this;
InitializeComponent();
}
private readonly BObjectCollection _rows;
public BObjectCollection Rows { get { return this._rows; } }
我的问题是,虽然我在 MainWindow 中创建了一个包含三个项目的 BObjectCollection,但我的 UserControl 中的 BObjectCollection 是空的。当我设置断点以查看发生了什么时,只有 RowsCoerce 中的断点触发,并且newValue
是一个空的 BObjectCollection,而不是包含三个项目的 BObjectCollection。我在 Rows getter 和 setter 中的断点以及 RowsChanged 方法永远不会出错。
我不明白为什么 UserControl 永远不会收到包含三个项目的 BObjectCollection(我在 MainWindow 中创建的那个)。我在这里做错了什么?我是否错误地设置了我的 DependencyProperty?我对 DependencyProperties 的经验很少。
对不起,代码墙,但我不知道问这个问题的更简单方法。