0

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

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

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

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

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

4

2 回答 2

1

只是为了说清楚:

  • 您希望控件上有一个只写的 DependencyProperty ItemsSource
  • 您希望控件的ViewModel上有一个只读的 Dependency-Property Items
  • 项目应返回转换后的版本并反映ItemsSource的更改

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

  • 将 ItemsSource-Property 添加到与控件中相同类型的 ViewModel
  • 双向绑定到控件的 DP
  • 在 ViewModel 的ItemsSource属性的 Set-accessor 中,使用ItemsSource元素的转换版本填充Items集合
  • 为Items属性触发 OnPropertyChanged

在这种情况下,Control 和 ViewModel 的ItemsSource是可读的。据我所知,只写 DP 是不可能的:

SO Thread 关于只写 DP

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

希望这会有所帮助,干杯...

于 2012-11-08T13:04:39.323 回答
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)
    {

    }
于 2012-11-08T07:12:52.640 回答