假设我有一个名为MyProperty的只读依赖项属性,它有一个公共get和一个受保护的setter,有没有办法在UserControl的XAML上设置这个属性的初始值?
问题是双重的:首先你不能直接引用XAML上的属性,因为顶级元素是,但我用以下技巧解决了这个问题:
<UserControl.Style>
<Style>
<Setter Property="local:MyUserControl.MyProperty" Value="{Binding someProperty}" />
</Style>
</UserControl.Style>
这导致
The Property Setter 'MyProperty' cannot be set because it does not have an accessible set accessor.
如何在不诉诸代码的情况下解决这个问题?
答案 0 :(得分:1)
受保护的setter实现不可变/只读依赖属性不是正确的方法。 使用SetValue和静态属性字段,仍可以设置值。你必须意识到你试图隐藏的访问器只是一种便利(围绕公共可用的SetValue的轻量级包装)。
您是否看过这篇MSDN文章:ReadOnly Dependency Properties?我知道对于这么简单的场景来说这是相当复杂的,但是嘿,WPF从来都不会变得简单。
答案 1 :(得分:1)
(不仅)MVVM的基本思想之一是从呈现数据封装数据 presentation (View)的定义。在我看来,你要做的并不是真正的MVVM风格。我认为数据字段的默认值是属于数据而不是它的表示。那么,为什么不在ViewModel中设置默认值。这更有意义(想想使用ViewModel的假设的第二个View:你仍然想要相同的默认值)并且你没有任何问题。是否有任何原因,您认为默认值是特定于视图的,因此想要在那里定义它?
其次,正如另一个答案所说,你的方法非常不一致,因为你想从“外部”设置一个受保护的属性。