WPF绑定来自两个控件的数据

时间:2016-01-16 15:10:49

标签: c# wpf wcf-binding

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

首先,我的自定义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.SelectedItem,则ItemDetailControl.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;
    }
}

1 个答案:

答案 0 :(得分:0)

通常,UI控件不会绑定到彼此的属性。 SelectedItem非常适合保存在ViewModel级别。如果您有一个基于这些控件的VM,您应该将这两个控件绑定到VM级属性。

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