数据绑定到动态加载的插件中的函数

时间:2010-01-27 07:03:40

标签: wpf data-binding mvvm command menuitem

我有几个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,但我不知道这是否是一种奇怪的方法呢?

编辑 - 好吧,我刚刚学到了新东西。接口不能有字段,所以不能用插件数据绑定,句号?

1 个答案:

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

我认为你的方法是正确的......它可能只是需要稍微调试一下。