2009-11-09 2 views
0

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

В моем текущем коде значение, заданное в первом свойстве 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 в обоих UserControls (модели также реализовали их).

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

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

+0

Я не могу придумать причину, по которой это не сработает. Может быть, еще один код может помочь пролить свет на проблему? – Grokys

+1

Как сказал @Groky, было бы полезно увидеть код для свойства SelectedItem. – Andy

ответ

2

Здесь пара ошибок.

Если вы используете Dependency Properties, вам не нужно реализовывать 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}" 
/> 
Смежные вопросы