【问题标题】:WPF UserControl DependencyProperty and INotifyPropertyChanged on an ObservableCollectionWPF UserControl DependencyProperty 和 INotifyPropertyChanged 在 ObservableCollection 上
【发布时间】:2014-03-18 20:40:22
【问题描述】:

在尝试的 MVVM 实现中,我有一个实现 INotifyPropertyChanged 的​​用户控件。 OnFilePathsChanged 似乎在 FilePaths 具有新值之后被调用,所以它只是再次复制它。如果我不实施 INotifyPropertyChanged OnPropertyChanged,则 VIEWMODEL 永远不会更新。我已经读过将 INotifyPropertyChanged 与 DependencyProperty 一起使用是多余的,但我想不出最好的方法来做到这一点。我错过了什么。有没有更简洁的方法来实现带有绑定 ObservableCollection 的 UserControl?

用户控制代码

private void LoadFileMenuItem_Click(object sender, RoutedEventArgs e)
    {
        OpenFileDialog dialog = new OpenFileDialog();

        if (dialog.ShowDialog() == true)
        {
            FilePaths.Add(dialog.FileName);
            OnPropertyChanged("FilePaths");
        }
    }

 private void InitFilePathsProperty()
    {
        this.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(FilePaths_PropertyChanged);
    }

    void FilePaths_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        this.SetValue(FilePathsProperty, ImageFilePaths);
    }

    public static readonly DependencyProperty FilePathsProperty = DependencyProperty.Register("FilePaths", typeof(ObservableCollection<string>), typeof(FileDisplayControl),
                new PropertyMetadata(OnImageFilePathsChanged));

    private static void OnFilePathsChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
        if (args.NewValue != null)
        {
            var myFileDisplayControl = obj as FileDisplayControl;
            if (myFileDisplayControl != null &&
                myFileDisplayControl.FilePaths != null)
            {
                FilePaths = this.GetValue(args.Property) as ObservableCollection<string>;
            }
        }
    }

    public ObservableCollection<string> FilePaths
    {
        get { return this.GetValue(FilePathsProperty) as ObservableCollection<string>;  }
        set { this.SetValue(FilePathsProperty, value); }
    }

在视图模型中

    public ObservableCollection<string> ViewModelFilePaths
    {
        get            {                return _viewModelFilePaths;            }
        set            {                _viewModelFilePaths = value;            }
    }

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

    实际上在问什么有点不清楚,但我认为这会对您提出任何问题有所帮助。如果您有一个数据绑定到UserControl.DataContext 的视图模型,您仍然可以使用RelativeSource Binding 将数据绑定到该控件中定义的任何DependencyPropertys。从UserControlUserControl里面看这个例子:

    绑定到UserControl DependencyProperty:

    <ListBox ItemsSource="{Binding FilePaths, RelativeSource={RelativeSource 
        AncestorType={x:Type YourPrefix:YourUserControl}}}" ... />
    

    绑定到数据绑定视图模型属性:

    <ListBox ItemsSource="{Binding ViewModelFilePaths}" ... />
    

    您应该在视图模型中实现INotifyPropertyChanged 接口,而不是UserControl... 至少,更习惯于在UserControl 中声明DependencyPropertys。但是,如果您已经在 UserControl 中声明了要绑定数据的普通 CLR 属性,那么您应该也在那里实现 INotifyPropertyChanged 接口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-17
      • 2014-05-03
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 2011-07-25
      相关资源
      最近更新 更多