WPF控件初始化时未更新属性

时间:2011-05-29 02:39:00

标签: c# wpf xaml initialization dependency-properties

我是WPF新手,无法从MainWindow XAML文件中获取自定义用户控件的属性值。

这里,我希望得到值“8”作为行数和列数,但在我的InitializeGrid()方法中,从不设置属性。它们总是“0”。我做错了什么?

任何参考资料也将受到赞赏。


这是我的MainWindow.xaml(相关部分):

<local:BoardView 
    BoardRows="8" 
    BoardColumns="8"
    />

这是我的BoardView.xaml:

<UniformGrid 
        Name="uniformGrid" 
        Rows="{Binding BoardRows}"
        Columns="{Binding BoardColumns}"
        >

    </UniformGrid>
</UserControl>

这是我的BoardView.xaml.cs:

[Description("The number of rows for the board."),
 Category("Common Properties")]
public int BoardRows
{
    get { return (int)base.GetValue(BoardRowsProperty); }
    set { base.SetValue(BoardRowsProperty, value); }
}
public static readonly DependencyProperty BoardRowsProperty =
    DependencyProperty.Register("BoardRows", typeof(int), typeof(UniformGrid));

[Description("The number of columns for the board."),
 Category("Common Properties")]
public int BoardColumns
{
    get { return (int)base.GetValue(BoardColumnsProperty); }
    set { base.SetValue(BoardColumnsProperty, value); }
}
public static readonly DependencyProperty BoardColumnsProperty =
    DependencyProperty.Register("BoardColumns", typeof(int), typeof(UniformGrid));

public BoardView()
{
    InitializeComponent();
    DataContext = this;
    InitializeGrid();
}

private void InitializeGrid()
{
    int rows = BoardRows;
    int cols = BoardColumns;

    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            uniformGrid.Children.Add( ... );
            // ...
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您已设置此绑定:

<UserControl ...>
    <UniformGrid 
        Name="uniformGrid" 
        Rows="{Binding BoardRows}"
        Columns="{Binding BoardColumns}"
        >

    </UniformGrid>
</UserControl>

问题是您的绑定无法正常工作,因为绑定使用的默认数据源是DataContext的{​​{1}}。你可能没有设置UserControl但是没关系,因为这不是你想要的。

您希望将DataContextRows的数量绑定到UniformGrid属性。由于BoardView.BoardRows是前一个代码段 一个UserControl,因此您可以为BoardView指定一个名称并使用BoardView语法来引用它是这样的:

ElementName

这说:“将<UserControl Name="boardView" ...> <UniformGrid Name="uniformGrid" Rows="{Binding BoardRows, ElementName=boardView}" Columns="{Binding BoardColumns, ElementName=boardView}" > </UniformGrid> </UserControl> 绑定到名为UniformGrid.Row的元素的BoardRows属性”,正是您想要的!