【问题标题】:Databinding to functions in dynamically-loaded plugins数据绑定到动态加载插件中的函数
【发布时间】:2011-01-09 20:19:37
【问题描述】:

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

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

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

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

EDIT -- 我修改了我的代码以更改 ObservableCollection 类型,果然,WPF 想要将数据绑定到类型 T。所以我想一种选择是让插件公开 ICommand,但我不知道这是否是一种奇怪的方法?

编辑 -- 好的,我刚刚学到了一些新东西。接口不能有字段,是不是不能和插件绑定数据,句号?

【问题讨论】:

  • 他们不能有字段,但他们可以有属性;-)。此外,插件并不是一个定义明确的术语。如果您认为插件很重要,您能解释一下您所说的插件是什么意思吗?

标签: wpf data-binding mvvm command menuitem


【解决方案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}" … />

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

【讨论】:

  • 感谢您的提示!我将查看绑定调试提示的链接。我总是可以在那个领域使用一些技巧。 :)
猜你喜欢
  • 2016-11-25
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
相关资源
最近更新 更多