在XAML中创建的DependencyObject无法绑定。

5

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

我创建了一个名为ValueCommandArgs的类,它继承自DependencyObject并拥有两个依赖属性(我们在这个例子中称它们为Value1Value2)。

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

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

我的命令参数中有一个ValueCommandArgs对象,然而属性Value1和Value2始终为空。

我知道可以使用MultiBinding和Converter来解决这个问题,但我认为我尝试的方法会更加简洁明了。

为什么这样不起作用?


你的输出窗口中是否出现了绑定错误? - dwatland
1
我认为绑定失败了。你期望DataContext被传递到ValueCommandArgs,但我认为它可能没有被传递。我也不知道如何实现一些类型来接收传递给它的DataContext。在这种情况下,您应该明确设置绑定的Source。(请注意,如果您的ValueCommandArgs继承自FrameworkElementFrameworkContentElement,则ElementNameRelativeSource可用)。 - King King
5
你需要一个绑定代理,请查看此链接 - http://www.thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/ - Novitchi S
@NovitchiS 这解决了问题;也许考虑将其写成答案? - dlf
当我有一些时间时,我会写一个答案,解释为什么绑定不起作用以及代理如何解决这个问题。 - Novitchi S
@NovitchiS 好的,两年后,还是没有几分钟吗? :) (无论如何,感谢您提供的链接解决了我的问题...但我一直在祈求所有的神不要让链接失效...) - Jan 'splite' K.
1个回答

2
Binding需要一个源对象才能提供值。当未指定绑定源(如SourceElementName等)时,例如:Value1="{Binding TestValue1}",则使用元素的DataContextargs:ValueCommandArgs对象不会从Button元素继承DataContext,因为属性值继承特别是基于父子关系在一棵元素树中的元素之间如何继承属性值。
按钮对象不包括CommandParameter属性的值,无论是逻辑树还是视觉树。
在许多情况下,可以通过直接将多个绑定值绑定到ViewModel来避免使用此类具有多个绑定值的CommandParameter
当无法避免时,可以使用不同类型的绑定标记扩展,例如:https://github.com/JohanLarsson/Gu.Reactive#ninjabinding ,它将使用根FrameworkElement作为绑定的源。
另一种方法是在这篇博客文章中展示的绑定代理技术:如何在未继承DataContext的情况下绑定数据

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接