WpfToolkit PropertyGrid
WpfToolkit PropertyGrid
我正在尝试以 MVVM 友好的方式绑定到来自 Extended WPF Toolkit™ by Xceed
的 PropertyGrid
的 PreparePropertyItem
事件:
<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 中执行所有操作 - 它是关于关注点分离。
我正在尝试以 MVVM 友好的方式绑定到来自 Extended WPF Toolkit™ by Xceed
的 PropertyGrid
的 PreparePropertyItem
事件:
<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 中执行所有操作 - 它是关于关注点分离。