2009-11-09 124 views
0

我有两个UserControl想要在窗口中显示。第一个UserControl的属性“SelectedItem”的值应该设置为第二个UserControl的“SelectedItem”属性。我该怎么做呢?WPF中控件的属性绑定

在我当前的代码中,在第一个UserControl属性中设置的值不会触发第二个UserControl中的更新。我为相应的用户控件/窗口附加了模型。

以下是窗口中的代码;

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

我还试图在绑定结构之上添加UpdateSourceTrigger=PropertyChanged,但无济于事。

在MyFirstUserControl中,我实现了一个链接到名为“SelectedItem”的属性的DependencyProperty,同样在MySecondUserControl中。我也试图在两个UserControls中实现INotifyPropertyChanged(模型也实现了它们)。

在MyFirstUserControl财产的set { },我试图使用OnPropertyChanged("SelectedItem")OnPropertyChanged(new DepedencyPropertyChangedEventArgs(...))以及SetValue(SelectedItemProperty),都未能在SelectedItem属性,第二用户控制触发更新。

我错过了什么?

+0

我想不出这是行不通的原因。也许更多的代码可能有助于阐明这个问题? – Grokys 2009-11-09 12:45:50

+1

正如@Groky所说,查看SelectedItem属性的代码会很有帮助。 – Andy 2009-11-09 13:43:38

回答

2

这里有几件事情是错误的。

如果您使用依赖属性,则不需要实现INotifyPropertyChanged。

此外,WPF不使用依赖属性的setter,而是直接设置后台字段。这就是为什么在setter中设置断点不起作用的原因。

如果您想在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}" 
/>