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

Posted

技术标签:

【中文标题】WPF 中的选择性双命令绑定转换器?【英文标题】:a selective dual command binding converter in WPF? 【发布时间】:2011-02-19 14:47:10 【问题描述】:

我首先要说我的 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】:

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

但是,如果您确实想使用转换器,我倾向于在命令绑定上使用它,传入 CLR 对象和布尔值,并允许它返回要绑定的正确命令。我认为没有理由传入命令参数,因为无论哪种方式都是一样的。

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 只是在应用程序设置中,您可以直接在转换器中使用它,并且只使用普通的单值转换器。不是很好的设计,因为它应该真正独立,但可以完成工作。

【讨论】:

以上是关于WPF 中的选择性双命令绑定转换器?的主要内容,如果未能解决你的问题,请参考以下文章

wpf命令的好处,直接用方法不行吗?搞的跟dos一样,感觉很奇特

值转换器 WPF中Image数据绑定Icon对象

ComboBox在WPF中的绑定示例:绑定项集合转换,及其源代码

WPF 数据绑定和级联转换器?

如何将WPF中的命令绑定到控件的双击事件处理程序

WPF 绑定不更新可见性