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.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;
}
}
通常,
UI 控件不会绑定到彼此的属性。 SelectedItem
是一个非常理想的,可以保持在ViewModel级别。如果有一个作为这些控件基础的 VM,则应将这两个控件绑定到 VM 级属性。
另请注意,"详细信息"控件通常不会更改"选定项",因此不应TwoWay
绑定。