0

我遇到了 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 的经验很少。

对不起,代码墙,但我不知道问这个问题的更简单方法。

4

1 回答 1

1

你在你的 中分配一个绑定RowsUserControl但是你正在将 的 设置DataContextUserControl本身。因此,绑定将解析为 的Rows属性,而UserControl不是.RowsWindow

通常DataContextUserControl. 相反,将其设置在您的可视化树中,UserControl如下所示:

<UserControl x:Name="root">
    <Grid DataContext={Binding ElementName=root}">
        <DataGrid ItemsSource="{Binding Rows}"/>
    </Grid>
</UserControl>
于 2013-05-03T18:19:07.857 回答