【问题标题】:Property binding across controls in WPFWPF 中跨控件的属性绑定
【发布时间】:2010-12-14 14:05:25
【问题描述】:

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

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

以下是Window中的代码;

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

我也尝试在上面的 Binding 结构中添加UpdateSourceTrigger=PropertyChanged,但无济于事。

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

在MyFirstUserControl 的属性set { } 中,我尝试使用OnPropertyChanged("SelectedItem")OnPropertyChanged(new DepedencyPropertyChangedEventArgs(...))SetValue(SelectedItemProperty),均未能触发第二个用户控件的SelectedItem 属性更新。

我错过了什么?

【问题讨论】:

  • 我想不出这不起作用的原因。也许更多代码可能有助于阐明问题?
  • 正如@Groky 所说,查看 SelectedItem 属性的代码会很有帮助。

标签: wpf binding controls properties


【解决方案1】:

这里有几件事是错误的。

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

另外,WPF 不使用依赖属性的设置器,而是直接设置支持字段。这就是为什么在 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}" 
/>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多