UserControl上的依赖项属性的任何方式都会在值的变化上对其视图模型执行命令?

时间:2012-11-08 03:30:48

标签: wpf mvvm prism

假设有一个带有依赖项属性的UserControl(某个对象的集合) - 无论如何,当设置依赖项属性时,是否有自动执行视图模型公开的命令而不破坏封装并执行此操作“ MVVM方式“?

是的,我知道我总是可以连接属性更改静态处理程序,将对象强制转换为我的用户控件的实例,获取数据上下文,将其转换为视图模型并手动调用命令

编辑:也许一个例子会有所帮助。我的UserControl有一个“ItemsSource”依赖属性..我希望它可以设置为ObjectA的集合。我有一个“Items”依赖项属性,它只是gettable,是ObjectB的集合。

我想要这样的行为,如果我设置了ItemSource,我的ObjectAs集合将被视图模型一对一地转换为ObjectBs,而Items依赖项属性将自动反映这一点。

为此,我想要一个只写的ItemsSource和一个只读的Items属性。

2 个答案:

答案 0 :(得分:1)

只是说清楚:

  • 您想在控制
  • 上使用只写的DependencyProperty ItemsSource
  • 您需要控件的 ViewModel
  • 上的只读依赖项属性
  • 项目应返回已转换的版本并反映 ItemsSource 的更改

如果这是你想要的,那将是一个解决方案:

  • 将一个ItemsSource-Property添加到ViewModel中 与控件中的相同类型
  • 双向绑定到控件的DP
  • ItemsSource 属性的Set-accessor中 ViewModel,使用转换后的版本填充 Items 集合 ItemsSource 元素
  • Items 属性
  • 的Fire OnPropertyChanged
在此方案中,Control和ViewModel的

ItemsSource 是可读的。据我所知,只写只读DP是不可能的:

SO Thread about write-only DPs

但是,这种方法无论如何都应该有用。

希望这会有所帮助,欢呼......

答案 1 :(得分:0)

如果您使用ObservableCollection,则可以使用CollectionChanged事件。

视图模型:

  private ObservableCollection<object> _Objects
  public ObservableCollection<object> Objects
  {
    get { return _Objects; }
    set { _Objects = value; 
           OnPropertyChanged(new PropertyChangedEventArgs("Objects"));
     }
  }

  Objects.CollectionChanged+= new System.Collections.Specialized.NotifyCollectionChangedEventHandler(Objects_CollectionChanged); 

 void Objects_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {

    }