我有几个MenuItem,其命令绑定到我的ViewModel。直到今天,所有这些都正确执行。
现在我添加了一个MenuItem,其ItemsSource绑定到ObservableCollection。这个MenuItem的目的是枚举一个插件列表,以便显示所有插件的名称。然后,当用户点击插件名称时,它应该调用一个函数来显示音频过滤器的属性。
在我当前的实现中,这不起作用,我尝试像这样数据绑定:
<MenuItem Header="Filters" ItemsSource="{Binding FilterPluginNames}">
<MenuItem.ItemContainerStyle>
<Style>
<Setter Property="MenuItem.Command" Value="{Binding ShowFilterDialogCommand}" />
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>
问题是我得到一个BindingExpression路径错误,因为它试图使用String作为MenuItem的DataContext。
这让我相信MenuItem的MenuItems的DataContext会自动设置为ItemsSource中的对象类型。这是真的吗?
如果我需要更改DataContext,那么我想将其更改为处理我所有其他命令的ViewModel。但是,如果我这样做,我怎么能告诉哪个插件我想显示过滤器属性?我至少需要传入一个CommandParameter,但是将这个值绑定到过滤器名称并不是我最喜欢的选项。还有其他方法吗?
如果DataContext确实自动设置为ObservableCollection中的对象类型,那么我宁愿直接调用我的接口方法ShowFilterProperties()。我敢打赌,如果没有Command绑定,我就无法做到这一点。如果是这样的话,你们如何应对这种应用?你是否让所有插件公开了一个命令处理程序,然后显示对话框?
编辑 - 我修改了我的代码以更改ObservableCollection类型,果然,WPF想要数据绑定到类型T.所以我想一个选项是让插件公开ICommand,但我不知道这是否是一种奇怪的方法呢?
编辑 - 好吧,我刚刚学到了新东西。接口不能有字段,所以不能用插件数据绑定,句号?
答案 0 :(得分:1)
你可能不像你认为的那样具有约束力。您可能只想对绑定进行一些诊断,并查看它们绑定到哪个对象。这是调试绑定的一个很好的链接:
http://www.beacosta.com/blog/?p=52
以下是一个示例:
<Window …
xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase"
/>
<TextBlock Text="{Binding Path=Caption, diagnostics:PresentationTraceSources.TraceLevel=High}" … />
我认为你的方法是正确的......它可能只是需要稍微调试一下。