【问题标题】:WPF Binding data from two controlsWPF 绑定来自两个控件的数据
【发布时间】:2016-04-22 01:50:50
【问题描述】:

我试图将自定义属性从一个控件绑定到另一个控件,这里代码:

首先,我的自定义 TreeViewControl

public partial class ItemTreeControl : UserControl
{
    readonly ItemTreeViewModel itemTreeViewModel;

    public static readonly DependencyProperty SelectedItemProperty = 
        DependencyProperty.Register("SelectedItem",
                                    typeof(Item), 
                                    typeof(ItemTreeControl),
                                    new PropertyMetadata(default(Item)));

    public Item SelectedItem
    {
        get { return (Item)GetValue(SelectedItemProperty); }
        set { SetValue(SelectedItemProperty, value); }
    }
}

这是另一个用于显示详细信息的自定义控件:

public partial class ItemDetailControl : UserControl
{
    public static readonly DependencyProperty DetailItemProperty = 
            DependencyProperty.Register("DetailItem",
                                         typeof(Item),
                                         typeof(ItemDetailControl),
                                         new PropertyMetadata(default(Item)));

    public Item DetailItem
    {
        get { return (Item)GetValue(DetailItemProperty); }
        set { SetValue(DetailItemProperty, value); }
    }
}

现在带有绑定的 XAML 代码:

<StackPanel>
    <ItemTreeControl x:Name="itemTreeControl"/>
    <ItemDetailControl DetailItem="{Binding ElementName=itemTreeControl,
                                      Path=SelectedItem, Mode=TwoWay}"/>
</StackPanel>

现在,如果一个新值到达ItemTreeControl.SelectedItemItemDetailControl.DetailItem 中的值不会改变。为什么?

已更新。

ItemTreeControl 中的代码隐藏:

private void myTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    if (e.NewValue is ItemViewModel)
    {
         SelectedItem = (e.NewValue as ItemViewModel).Item;
    }
    else
    {
        SelectedItem = null;
    }
}

【问题讨论】:

  • 代码中一个有趣的部分是值如何到达未提供的SelectedItem

标签: c# wpf wcf-binding


【解决方案1】:

一般来说,UI 控件不会绑定到彼此的属性。 SelectedItem 是保持在 ViewModel 级别的理想选择。如果你有一个基于这些控件的 VM,你应该真正将这两个控件绑定到一个 VM 级别的属性。

还要注意,Detail 控件通常不会更改 SelectedItem,因此绑定不应为 TwoWay

【讨论】:

  • 但是我怎样才能从ItemTreeControls ViewModel 获取属性SelectedItem,并将其传递给ItemDetailControl
  • 在你的 View 后面很可能有一个 ViewModel,在其中定义了一个 SelectedItem 成员。两个控件都将绑定到该成员。如果您使用的是 MVVM Light 或其他一些库,则您已经有类似 RaisePropertyChanged 的内容,您可以在属性设置器中调用它,以允许您的控件收到更新的属性值的通知。
猜你喜欢
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-14
相关资源
最近更新 更多