Привязка свойств к элементам управления в WPF - PullRequest
0 голосов
/ 09 ноября 2009

У меня есть два пользовательских элемента управления, которые я хочу отобразить в окне. Значение свойства "SelectedItem" первого UserControl должно быть установлено на свойство второго Seоном UserControl "SelectedItem". Как мне это сделать?

В моем текущем коде значение, установленное в первом свойстве UserControl, не вызывает обновления во втором UserControl. Я приложил модели для соответствующего usercontrol / окна.

Ниже приведен код в окне;

<MyControls:MyFirstUserControl x:Name="m_controlOne" />
<MyControls:MySecondUserControl x:Name="m_controlTwo" SelectedItem={Binding Path=SelectedItem, ElementName="m_controlOne" />

Я также пытался добавить UpdateSourceTrigger=PropertyChanged в структуру Binding выше, но безрезультатно.

В MyFirstUserControl я реализовал DependencyProperty, который связан со свойством под названием «SelectedItem», а также в MySecondUserControl. Я также попытался реализовать INotifyPropertyChanged в обоих пользовательских элементах управления (в моделях они также реализованы).

В свойстве set { } свойства MyFirstUserControl я попытался использовать OnPropertyChanged("SelectedItem"), OnPropertyChanged(new DepedencyPropertyChangedEventArgs(...)), а также SetValue(SelectedItemProperty), но все не удалось запустить обновление в свойстве SelectedItem для второго пользовательского элемента управления.

Что я пропустил?

1 Ответ

2 голосов
/ 09 ноября 2009

Несколько вещей здесь не так.

Если вы используете свойства зависимости, вам не нужно реализовывать INotifyPropertyChanged.

Кроме того, WPF не использует установщик свойства зависимости, а вместо этого устанавливает поле поддержки напрямую. Вот почему установка точки останова в установщике не работает.

Если вы хотите выполнить код, когда WPF устанавливает свойство, существует перегрузка метода Register, который позволяет вам указывать обработчик, который запускается каждый раз, когда устанавливается свойство.

public static readonly DependencyProperty SelectedItemProperty =
    DependencyProperty.Register(
        "SelectedItem", typeof(object), typeof(MySecondUserControl),
        new PropertyMetadata(SelectedItemChanged));

private static void SelectedItemChanged(
    DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    MySecondUserControl instance = (MySecondUserControl)d;
    instance.OnSelectedItemChanged(e);
}

protected virtual void OnSelectedItemChanged(
    DependencyPropertyChangedEventArgs e)
{
    // Do code triggered by change here
}

Наконец, синтаксис привязки неверен (опечатка?). Вы пропускаете}, и ваши цитаты не в том месте. Должно быть:

<MyControls:MySecondUserControl 
    x:Name="m_controlTwo" 
    SelectedItem="{Binding Path=SelectedItem, ElementName=m_controlOne}" 
/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...