WpfToolkit PropertyGrid

WpfToolkit PropertyGrid

我正在尝试以 MVVM 友好的方式绑定到来自 Extended WPF Toolkit™ by XceedPropertyGridPreparePropertyItem 事件:

<UserControl x:Class=(...)
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
xmlns:mvvm="http://prismlibrary.com/" 
(...)
<xctk:PropertyGrid x:Name="PropertyGrid" SelectedObject="{Binding}">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="PreparePropertyItem">
            <mvvm:InvokeCommandAction Command="{Binding PreparePropertyCommand}"/> //PRISM's InvokeCommandAction doesn't work
            <i:InvokeCommandAction Command="{Binding PreparePropertyCommand}"/> //BLEND's InvokeCommandAction doesn't work either
        </i:EventTrigger>
    </i:Interaction.Triggers>
</xctk:PropertyGrid>

我的自定义 PreparePropertyCommand 在加载或显示 propertygrid 时未被调用,仅在我单击以展开 [ExpandableObject]

时被调用

这真的很奇怪,因为如果我简单地绑定到事件,它就会直接运行:

<xctk:PropertyGrid x:Name="PropertyGrid" SelectedObject="{Binding}" PreparePropertyItem="PropertyGrid_PreparePropertyItem">

当然这会破坏 MVVM 模型,因为 PropertyGrid_PreparePropertyItem 继续在视图的代码隐藏中。

有什么见解吗?谢谢!

您的事件触发器不起作用的原因是 PreparePropertyItem 是一个附加事件:http://joyfulwpf.blogspot.se/2009/05/mvvm-invoking-command-on-attached-event.html

of course this breaks MVVM model since PropertyGrid_PreparePropertyItem goes on code-behind of the view.

如果您只是从与您的 XAML 标记在

中定义的视图完全相同的代码隐藏中调用命令,则不会
private void PropertyGrid_PreparePropertyItem(object sender, Xceed.Wpf.Toolkit.PropertyGrid.PropertyItemEventArgs e)
{
    YourViewModel vm = PropertyGrid.DataContext as YourViewModel;
    if (vm != null)
        vm.PreparePropertyCommand.Execute(null);
}

MVVM 不是要从视图中删除与视图相关的 代码并在XAML 中执行所有操作 - 它是关于关注点分离。