0

我需要有一个 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 。

4

1 回答 1

0

如上所述,我想通了。我不得不使用SelfforRelativeSource并且成功了。

于 2010-05-26T15:37:41.033 回答