我的ViewModel应该继承自DependencyObject吗?

时间:2017-04-07 06:04:00

标签: c# wpf xaml uwp

好的,基本上我的目标是在代码中设置Binding而不是XAML。 source属性是一个字符串的自定义依赖项属性。 target属性位于ViewModel中,它也是一个字符串,但它不是依赖属性(因为ViewModel当然不是DependencyObject)。

所以target属性只是一个字符串属性(我们将调用此属性MyTextProperty)。

这种绑定方法通过XAML工作(到目前为止只尝试使用x:bind),但我似乎无法用纯C#来解决这个问题。

BindingOperations.SetBinding()期望目标是依赖项属性,但MyTextProperty只是一个位于我的ViewModel中的简单字符串属性。

我只是想知道是否有办法让这项工作成功。我的ViewModel需要是DependencyObject吗?虽然我从来没有尝试过它,但它看起来它会起作用。这种方法会被视为一种良好的模式/做法吗?任何帮助将不胜感激。感谢。

3 个答案:

答案 0 :(得分:1)

可能的解决方案是使用OneWayToSource或TwoWay绑定创建绑定。通过这种方式,可以绑定到控件的DependencyProperty和" normal" viewmodel中的属性

答案 1 :(得分:1)

  

我的ViewModel应该从DependencyObject继承吗?

     

我的ViewModel需要是DependencyObject吗?

不,不。它不应该像Bahman那样:

  
      
  1. DependencyObjects未标记为可序列化。
  2.   
  3. DependencyObject类重写并密封Equals()和GetHashCode()方法。

  4.   
  5. DependencyObject具有线程关联性 - 只能在创建它的线程上访问它。

  6.   

Tell me more

我倾向于创建一个UserControl并在那里公开依赖项属性。您可以覆盖OnxxxPropertyChanged,让您的视图模型了解更改。

使用这种方法,您的控件将以WPF的设计方式参与依赖项属性通信。

考虑到你已经在考虑使用DependencyProperties告诉我你有一个想要设置控件属性并且无法访问底层视图模型的异物。 DP是完美的。

否则,如果我们只是在谈论视图的代码隐藏,那么您只需直接与视图模型对话并完成它。

答案 2 :(得分:1)

  

BindingOperations.SetBinding()期望目标是依赖项属性,但MyTextProperty只是一个位于我的ViewModel中的简单字符串属性。

您误解了绑定目标和绑定源:预期的目标依赖项属性是可视XAML控件的属性(即Text控件的TextBlock属性。您的视图模型属性MyTextProperty是绑定的

所以,不,你的视图模型不需要继承DependencyObject

这里有关于如何通过代码配置绑定的MSDN link

但是,通过这样做,您必须在视图模型中引用您的视觉控制,这是一种不好的做法。