我需要有一个 ToggleButton 的命令处理程序,它可以采用多个参数,即所述 ToggleButton 的 IsChecked 属性,以及一个常量值,它可以是字符串、字节、int ... 没关系。
我在 SO 上找到了这个很好的问题,并按照答案的链接阅读了 MultiBinding 和 IMultiValueConverter。在我不得不编写 MultiBinding 之前,它真的很顺利,当我意识到我还需要传递一个常量值并且不能做类似的事情时
<Binding Value="1" />
然后我遇到了 Kent Boogaart 回答的另一个类似问题,然后我开始思考可以解决这个问题的方法。
一种可能的方法是不使用 MVVM,只需将 Tag 属性添加到我的 ToggleButton,在这种情况下,我的 MultiBinding 将如下所示:
<MultiBinding Converter="{StaticResource MyConverter}">
<MultiBinding.Bindings>
<Binding Path="IsChecked" />
<Binding Path="Tag" />
</MultiBinding.Bindings>
</MultiBinding>
Kent 曾发表评论,“如果你使用 MVVM,你应该能够解决这个问题”。但是,我不确定这是否适合我,即使我已采用 MVVM 作为 WPF 模式的必要选择。
之所以这么说,是因为我在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 。