Свойства не обновляются при инициализации элемента управления WPF - PullRequest
3 голосов
/ 29 мая 2011

Я новичок в WPF, и у меня возникают проблемы с получением значений свойств для пользовательского элемента управления из файла XAML MainWindow.

Здесь я хочу получить значение "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 Ответ

1 голос
/ 29 мая 2011

У вас есть эта привязка настроена:

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

    </UniformGrid>
</UserControl>

Проблема в том, что ваша привязка не работает, поскольку привязка использует источник данных по умолчанию, который является DataContext из UserControl. Возможно, вы не установили DataContext, но это нормально, потому что это не то, что вам нужно.

Вы хотите связать число Rows в UniformGrid со свойством BoardView.BoardRows. Поскольку UserControl - это предыдущий фрагмент кода, - это a BoardView, вы можете присвоить BoardView имя и использовать синтаксис ElementName для ссылки на него следующим образом:

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

    </UniformGrid>
</UserControl>

Это говорит: «Привязать UniformGrid.Row к свойству BoardRows элемента с именем boardView», именно то, что вы хотите!

...