我在网格中有4个按钮,datacontext设置为一个对象,该对象具有指示应该启用哪个按钮的属性(它是可枚举的)。
Currenty我已经在代码隐藏中完成了这项工作,因此当特定属性发生更改时,它会根据值禁用除一个属性之外的所有属性。它可以工作,但我真的不喜欢把这样的东西放到代码隐藏中。必须有一种方法可以在xaml中执行此操作吗?
我可以为所有四个按钮创建自己的样式,然后使用数据触发器执行此操作,但我更喜欢更通用的方法:对所有按钮使用相同的样式,以某种方式应用不同,具体取决于,例如,按钮名称和值财产。
提前致谢。
答案 0 :(得分:1)
您可以使用MultiBinding将IsEnabled属性绑定到控件名称和DataContext中属性的组合,并创建一个Style以将其应用于Grid中的所有按钮:
<Grid.Resources>
<local:EqualsConverter x:Key="EqualsConverter"/>
<Style TargetType="Button">
<Setter Property="IsEnabled">
<Setter.Value>
<MultiBinding Converter="{StaticResource EqualsConverter}">
<Binding RelativeSource="{RelativeSource Self}" Path="Name"/>
<Binding Path="EnabledButtonName"/>
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</Grid.Resources>
在代码中:
public class EqualsConverter
: IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return values.Length == 2 && object.Equals(values[0], values[1]);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
return null;
}
}
答案 1 :(得分:1)
您可以通过对枚举值进行整数引用并将这些枚举值设为ConverterParameters来为相应的按钮创建您创建的enum
与按钮之间的关联。
例如:
枚举:
public enum myOptions
{
value1 = 1,
value2 = 2,
value3 = 3,
value4 = 4
}
绑定:
<Button IsEnabled = {Binding Path=myProperty,
Converter = {StaticResource EnumToBoolConverter},
ConverterParameter = 1} />
<Button IsEnabled = {Binding Path=myProperty,
Converter = {StaticResource EnumToBoolConverter},
ConverterParameter = 2} />
转换器:
public class EnumToBoolConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (int)value == (int)parameter;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return null;
}
}