2010-01-27 55 views
0

我有几个MenuItems的命令绑定到我的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路径错误,因为它试图用一个字符串作为菜单项的DataContext的。

这使我相信MenuItem的MenuItems的DataContext被自动设置为ItemsSource中的对象类型。这是真的?

如果我需要更改DataContext,那么我想将其更改为处理所有其他命令的ViewModel。但是如果我这样做了,我怎么能够知道我想要显示哪些插件的过滤器属性?我至少需要传入CommandParameter,但将此值绑定到过滤器名称并不是我最喜欢的选项。有没有其他方法可以做到这一点?

如果DataContext确实自动设置为ObservableCollection中的对象类型,那么我宁愿直接调用我的接口方法ShowFilterProperties()。我敢打赌,如果没有命令绑定,我无法做到这一点。如果是这样的话,你们如何处理这种应用?你是否让所有的插件暴露了一个命令处理程序,然后将显示对话框?

编辑 - 我修改代码来改变的ObservableCollection类型,果然,WPF想要所以我想一个选择是有插件暴露ICommand的数据绑定到类型T,但我不”不知道这是不是一个奇怪的方法?

编辑 - 好的,我刚学到了一些新东西。接口不能有字段,那么是不是可以使用插件进行数据绑定?

+0

他们不能有字段,但他们可以有属性;-)。另外,插件并不是一个明确定义的术语。如果你认为这很重要,你能解释一下你的意思吗? – 2010-01-27 17:50:21

回答

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}" … /> 

我觉得你的做法是正确的...它可能只是需要调试一点。

+0

感谢您的提示!我将检查绑定调试提示的链接。我总是可以在这方面使用一些技巧。 :) – Dave 2010-01-27 23:16:29