【发布时间】:2011-01-11 00:59:56
【问题描述】:
我需要有一个 ToggleButton 的命令处理程序,它可以接受多个参数,即所述 ToggleButton 的 IsChecked 属性,以及一个常量值,它可以是字符串、字节、int... 没关系。
我找到了this great question on SO,并按照答案的链接阅读了 MultiBinding 和 IMultiValueConverter。在我不得不编写 MultiBinding 之前,它真的很顺利,当我意识到我还需要传递一个常量值并且不能做类似的事情时
<Binding Value="1" />
然后我遇到了另一个similar question that Kent Boogaart answered,然后我开始思考如何解决这个问题。
一种可能的方法是不使用 MVVM,只需将 Tag 属性添加到我的 ToggleButton,在这种情况下,我的 MultiBinding 将如下所示:
<MultiBinding Converter="{StaticResource MyConverter}">
<MultiBinding.Bindings>
<Binding Path="IsChecked" />
<Binding Path="Tag" />
</MultiBinding.Bindings>
</MultiBinding>
Kent 曾发表评论,“如果您使用 MVVM,您应该能够解决这个问题”。但是,我不确定这是否适合我,即使我已采用 MVVM 作为我的 WPF 模式的 necessity 选择。
之所以这么说,是因为我在UserControl中有不止一个ToggleButton,而且每个ToggleButtons的Commands都需要调用同一个函数。但是由于它们是ToggleButtons,我不能在ViewModel中使用绑定到IsChecked的属性,因为我不知道最后点击的是哪一个。我想我可以添加另一个私有财产来跟踪这一点,但这似乎有点傻。就常数而言,如果我做了跟踪的想法,我可能会摆脱它,但不确定是否有任何其他方法可以绕过它。
这里有没有人对我有好的建议? :)
编辑 -- 好的,所以我需要更新我的绑定,但仍然不能正常工作:
<ToggleButton Tag="1" Command="{Binding MyCommand}" Style="{StaticResource PassFailToggleButtonStyle}" HorizontalContentAlignment="Center" Background="Transparent" BorderBrush="Transparent" BorderThickness="0">
<ToggleButton.CommandParameter>
<MultiBinding Converter="{StaticResource MyConverter}">
<MultiBinding.Bindings>
<Binding Path="IsChecked" RelativeSource="{RelativeSource Mode=Self}" />
<Binding Path="Tag" RelativeSource="{RelativeSource Mode=Self}" />
</MultiBinding.Bindings>
</MultiBinding>
</ToggleButton.CommandParameter>
</ToggleButton>
IsChecked 有效,但标签无效。我刚刚意识到 Tag 是一个字符串......呃。它现在正在工作!关键是使用 Self 的 RelativeSource。
【问题讨论】:
-
我上面的绑定是错误的,因为它正在查询虚拟机。任何人都有提示,或者你能推荐一个好的在线“备忘单”来找出数据绑定路径吗?我通常会查看输出窗口中的错误以查看它绑定到的内容。现在,我想我必须设置 RelativeSource 属性,但以前从未使用过。
-
好的,我找到了这个:stackoverflow.com/questions/84278/…
-
绑定到常量的可能技巧:使用资源。
<sys:Int32 x:Key="One">1</sys:Int32>在您的资源部分,然后是{Binding Source="{StaticResource One}"}。不过完全未经测试。 -
嘿,这是一个不错的选择,谢谢!该标签对我来说工作正常...想知道是否存在任何性能差异。
标签: wpf data-binding multibinding imultivalueconverter commandparameter