WPF中的选择性双命令绑定转换器?

时间:2010-05-14 16:20:14

标签: wpf binding command converter

我会开始说我没有在我的WPF应用程序中使用MVVM模式。请原谅我。

现在我有一个带有两个按钮的数据模板,每个按钮绑定到此数据模板所代表的CLR对象上的不同命令。两者都使用相同的命令参数。这是按钮的一个例子。

<Button x:Name="Button1"
        Command="{Binding Path=Command1}"
        CommandParameter="{Binding Path=Text, ElementName=TextBox1}"
/>
<Button x:Name="Button2"
        Command="{Binding Path=Command2}"
        CommandParameter="{Binding Path=Text, ElementName=TextBox1}"
/>

我想将此重构为一个按钮,该按钮可以根据用户设置执行任一命令,如Settings.settings中的布尔值。我无权重构CLR对象本身。这也是一个数据模板,没有代码隐藏供我使用。我认为转换器是最好的选择,但我不知道如何把它放在一起。

转换器需要接受CommandParameter以及DataContext,以便它知道在哪个对象上执行命令。

有人可以帮我一把吗?提前谢谢。

1 个答案:

答案 0 :(得分:4)

快速而肮脏的解决方案 - 将两个按钮放在表单上并将其可见性绑定到bool的值(显然是一个否定) - 这样只会显示有效按钮。

如果你确实想使用转换器,我倾向于在命令绑定上使用它,传入CLR对象和bool的值,并允许它返回正确的命令绑定到。我认为没有理由传递命令参数,因为这两种方式都是相同的。

XAML:

<Resources>
  <controls:CommandConverter x:Key="CommandConverter"/>
</Resources>

<Button x:Name="Button" 
        CommandParameter="{Binding Path=Text, ElementName=TextBox1}">
    <Button.Command>
        <MultiBinding Converter="{StaticResource CommandConverter}">
          <MultiBinding.Bindings>
            <Binding /><-- the datacontext CLR object -->
            <Binding ... /><-- Application setting (however you intend to get that in)
          </MultiBinding.Bindings>
        </MultiBinding>
    </Button.Command>
</Button>

代码:

public class CommandConverter : IMultiValueConverter
{        
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        CommandObject clrObject= (CommandObject)values[0]; 
        bool setting = (bool)values[1];

        if (setting)
        {
            return clrObject.Command1;
        }

        return clrObject.Command2;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

实际上,如果设置bool只是在应用程序设置中,那么可以直接在转换器中使用它,并且只使用普通的单值转换器。不是很好的设计,因为它应该真的独立,但将完成工作。