我会开始说我没有在我的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,以便它知道在哪个对象上执行命令。
有人可以帮我一把吗?提前谢谢。
答案 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只是在应用程序设置中,那么可以直接在转换器中使用它,并且只使用普通的单值转换器。不是很好的设计,因为它应该真的独立,但将完成工作。