2010-05-14 36 views
1

我将开始说,我没有使用我的WPF应用程序的MVVM模式。请原谅我。WPF中的一个选择性双重命令绑定转换器?

现在我有一个数据模板,带有两个按钮,每个数据模板绑定到此数据模板表示的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,以便知道执行命令的对象。

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

回答

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(); 
    } 
} 

其实如果设置布尔只是在应用程序设置你可以只是直接在转换器和唯一的使用方式,因此一个正常的单值转换器。不是很棒的设计,因为它应该是独立的,但会完成工作。

+0

当然! 我只是失败了WPF 101。 – Jippers 2010-05-14 17:11:54