【问题标题】:Is there a way to set the value of a read-only dependency property in the XAML of the control it's defined in?有没有办法在定义它的控件的 XAML 中设置只读依赖属性的值?
【发布时间】:2025-12-09 21:10:01
【问题描述】:

假设我有一个名为 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.

任何想法如何在不求助于代码的情况下解决这个问题?

【问题讨论】:

    标签: .net wpf mvvm


    【解决方案1】:

    (不仅仅是)MVVM的一个基本思想是从呈现的数据中封装数据呈现(视图)的定义。在我看来,你想要做的并不是真正的 MVVM 风格。我会将数据字段的默认值视为属于数据而不是表示的东西。那么,为什么不在 ViewModel 中设置默认值。这更有意义(考虑使用 ViewModel 的假设的第二个视图:您仍然需要相同的默认值)并且您没有任何问题。有什么原因,您认为默认值是特定于视图的,因此想在那里定义它?

    其次,正如另一个答案所说,您的方法非常不一致,因为您想从“外部”设置受保护的属性。

    【讨论】:

      【解决方案2】:

      受保护的设置器来实现不可变/只读依赖属性不是正确的方法。 使用 SetValue 和静态属性字段仍然可以设置值。您必须意识到您试图隐藏的访问器只是一种便利(公共可用 SetValue 的轻包装)。

      您是否看过这篇 MSDN 文章:ReadOnly Dependency Properties?我知道这样一个简单的场景是相当复杂的,但是,嘿,WPF 从来没有变得简单。

      【讨论】:

        最近更新 更多