使用MVVM的WPF ReadOnly依赖项属性

And*_*rke 7 wpf binding dependency-properties mvvm

我最近重写了DevXpress WPF网格,给自己一个SelectedObject属性,我可以从松散绑定的ViewModel访问它.

我已经创建了一个SelectedObject依赖项属性,并在我的XAML中绑定了OneWayToSource.

Everthing工作正常,但如果我尝试将其设为ReadOnly(为了完整性),我会收到编译错误并说我无法绑定到ReadOnly属性.下面的代码编译,我已经包括(但重新列出)我尝试获取属性ReadOnly时尝试的位.

有人可以帮忙吗?

我重写的控件的依赖属性如下所示:

  //public static readonly DependencyPropertyKey SelectedRowKey = DependencyProperty.RegisterReadOnly("SelectedObject", typeof(object), typeof(MyGrid), new PropertyMetadata(null));
//public static readonly DependencyProperty SelectedObjectProperty = SelectedRowKey.DependencyProperty;

public readonly static DependencyProperty SelectedObjectProperty = DependencyProperty.Register("SelectedObject", typeof(object), typeof(MyGrid), new PropertyMetadata(null));

public object SelectedObject
{
    get
    {

        return GetValue(SelectedObjectProperty);
    }
    set
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

XAML是:

 <StackPanel>
  <devxgrid:MyGrid AutoPopulateColumns="True" DataSource="{Binding Animals}" SelectedObject="{Binding MyObject, Mode=OneWayToSource}" Width="300" Height="300">
    <devxgrid:MyGrid.View>
        <MyGrid:TableView AllowEditing="False" Name="GridView" AutoWidth="True" />
    </devxgrid:MyGrid.View>
 </devxgrid:MyGrid>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

Ken*_*art 4

SelectedObject您正在尝试在 XAML 中设置该属性。如果是只读的话,如何设置呢?

编辑:对不起,我的错。刚刚意识到你想要做什么,你是对的,它应该有效。但是,WPF 不支持这种情况,至少在 3.5 中是这样。

编辑 2:刚刚签入 .NET 4 和同样的故事。

顺便说一句,如果您遇到了试图“推送”到虚拟机中的其他人的只读 DP,您可以使用附加行为来解决此问题。例如,假设您希望 VM 了解视图的ActualWidth和属性。ActualHeight您可以编写一个SizeWatcherBehavior附加到FrameworkElement并侦听大小变化的程序。检测到时,这些大小更改将被推送到 VM 可以绑定到的读/写附加属性:

<Grid local:SizeWatcherBehavior.Watch="True"
    local:SizeWatcherBehavior.Width="{Binding WidthOnVM, Mode=OneWayToSource}"
    local:SizeWatcherBehavior.Height="{Binding HeightOnVM, Mode=OneWayToSource}"/>
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是 WPF 和采用 MVVM 模式的一个严重问题。当源属性为只读时,您可以定义 OneWay 绑定,这很棒。但是,当目标 DP 为只读时,您将无法定义 OneWayToSource 绑定。我真的不明白为什么不.. (3认同)
  • 作为参考,我为此提出了一个问题,并今天得到了一些反馈。每个设计都不支持它,并且在最近的将来也不会支持它。https://connect.microsoft.com/WPF/feedback/ViewFeedback.aspx?FeedbackID=523865 (2认同)