【发布时间】:2014-05-01 09:58:01
【问题描述】:
我在 WPF 中有以下帮助程序类:
public class EnhancedTreeView : TreeView, INotifyPropertyChanged
{
public static readonly DependencyProperty SelectedItemsProperty = DependencyProperty.Register("SelectedItem", typeof(Object), typeof(EnhancedTreeView), new PropertyMetadata(null));
public new Object SelectedItem
{
get { return GetValue(SelectedItemProperty); }
set
{
SetValue(SelectedItemsProperty, value);
NotifyPropertyChanged("SelectedItem");
}
}
public EnhancedTreeView()
{
SelectedItemChanged += MyTreeView_SelectedItemChanged;
}
private void MyTreeView_SelectedItemChanged(Object sender, RoutedPropertyChangedEventArgs<Object> e)
{
SelectedItem = base.SelectedItem;
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String aPropertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(aPropertyName));
}
}
在页面上一切正常:
<local:EnhancedTreeView
x:Name="StructureTreeView"
Grid.Column="0"
Margin="5"
BorderThickness="0,0,1,0"
BorderBrush="LightBlue"
Background="#FFFAFAFA"
DataContext="{Binding Path=TreeViewModel}"
SelectedItem="{Binding Path=SelectedTreeViewItem, Mode=TwoWay}"
ItemsSource="{Binding Items}">
但我的问题是,如果我使用与上述相同的 XAML 打开一个新窗口,我有两个 TreeviewHelper 实例,但只有一个静态 DependencyProperty。
因此,当用户在一个风或一页中选择树视图中的一个节点时,两个树视图都会做出反应,因为它们绑定到相同的静态 DependencyProperty。
此问题最简单的解决方法/解决方案是什么?不,不要将 DependencyProperty 设为非静态,因为当 WPF 检测到两个相同的 DependencyProperty 时它会抛出。
【问题讨论】:
-
我认为您误解了依赖属性,您的代码将视图模型代码(INotifyPropertyChanged)与视图代码(依赖属性)混合在一起。
-
thumbmunkeys,你说得对!!,我从 Helper 类中删除了 INotifyPropertyChanged 接口和相关代码。但原来的问题依然存在。
-
我猜你在两个视图中都绑定到
TreeViewModel的同一个实例。 DependencyProperties 的注册应该是静态的
标签: c# wpf xaml treeview dependency-properties