我试图将自定义属性从一个控件绑定到另一个控件,这里是代码:
首先,我的自定义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;
}
}
答案 0 :(得分:0)
通常,UI控件不会绑定到彼此的属性。 SelectedItem
非常适合保存在ViewModel级别。如果您有一个基于这些控件的VM,您应该将这两个控件绑定到VM级属性。
另请注意,Detail控件通常不会更改SelectedItem,因此绑定不应为TwoWay
。