【问题标题】:WPF Helper class with static DependencyProperty used on several open windowss在几个打开的窗口上使用具有静态 DependencyProperty 的 WPF Helper 类
【发布时间】: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


【解决方案1】:

事实证明,我在两个树视图中引用了相同的 ObservableCollection,当我更改两个视图模型以填充它们自己的 ObservableCollection 并且每个都使用它们赢得的 SelectedTreeViewItem 时,Dependencyproperty 的问题就消失了。

感谢所有建议,这让我清理了我的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    相关资源
    最近更新 更多