【问题标题】:Binding doesn't work on DependencyObject created in XAML绑定不适用于在 XAML 中创建的 DependencyObject
【发布时间】:2014-10-14 15:50:47
【问题描述】:

我正在尝试使用自定义类在 XAML 中传递多个 CommandParameters。

我创建了一个名为 ValueCommandArgs 的类,它继承自 DependencyObject 并具有两个 DepencyProperties(我们称它们为 Value1Value2 用于此示例)。

应该调用命令并传递此对象的按钮如下所示:

<Button Command="{Binding ChangeValueCommand}" Content="Execute Command">
    <Button.CommandParameter>
        <args:ValueCommandArgs Value1="{Binding TestValue1}" Value2="{Binding TestValue2}" />
    </Button.CommandParameter>
</Button>

我的命令中确实有一个 ValueCommandArgs-Object 作为参数,但是属性 Value1Value2 始终为 null/空

我知道这可以通过 MultiBinding 和 Converter 解决,但我认为我正在尝试的方式会更简洁。

为什么这不起作用?

【问题讨论】:

  • 您的输出窗口中是否出现绑定错误?
  • 我认为绑定失败。您期望 DataContext 被传递给 ValueCommandArgs 但我认为它不可能。我也不知道如何实现某种可以接收传递给它的 DataContext 的类型。在这种情况下,您应该为您的绑定显式设置Source。 (请注意,ElementNameRelativeSource 仅在您的 ValueCommandArgs 继承自 FrameworkElement 或 FrameworkContentElement 时才可用)。
  • 你需要一个绑定代理检查一下 - thomaslevesque.com/2011/03/21/…
  • @NovitchiS 解决了问题;也许考虑把它写下来作为答案?
  • 当然,我会在几分钟后写一个关于为什么绑定不起作用以及代理如何解决问题的答案。

标签: c# wpf xaml binding


【解决方案1】:

Binding 需要一个源对象才能提供值。当未指定绑定源时(使用SourceElementName 等)例如:Value1="{Binding TestValue1}" 使用元素的DataContext

args:ValueCommandArgs 对象不会从Button 元素继承DataContext,因为属性值继承特别是关于属性值如何根据父子关系从一个元素继承到另一个元素在元素树中

按钮对象在其逻辑树和可视树中均不包含CommandParameter 属性的值。

在许多情况下,可以通过将值直接绑定到 ViewModel 来避免需要具有多个绑定值的 CommandParameter

如果无法避免,您可以使用不同类型的绑定标记扩展,例如:https://github.com/JohanLarsson/Gu.Reactive#ninjabinding,它将使用根 FrameworkElement 作为绑定源。

另一种方法是本博文中展示的绑定代理技术:How to bind to data when the DataContext is not inherited

【讨论】:

    猜你喜欢
    • 2016-10-15
    • 2015-03-28
    • 2017-03-04
    • 2011-11-22
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    相关资源
    最近更新 更多