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

本文关键字:两个 控件 数据 绑定 WPF | 更新日期: 2023-09-27 18:30:36

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

首先,我的自定义树视图控件

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;
    }
}

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

通常,

UI 控件不会绑定到彼此的属性。 SelectedItem是一个非常理想的,可以保持在ViewModel级别。如果有一个作为这些控件基础的 VM,则应将这两个控件绑定到 VM 级属性。

另请注意,"详细信息"控件通常不会更改"选定项",因此不应TwoWay绑定。