Wpf 根据XAML中的单个属性更改项集合的外观
我在网格中有4个按钮,其中datacontext被设置为一个对象,该对象的属性指示应该启用哪个按钮(它是可枚举的) 目前,我已经在代码隐藏中完成了这项工作,因此当特定属性发生更改时,它会根据值禁用除一个之外的所有属性。这是可行的,但我真的不喜欢把这样的东西放在代码后面。在xaml中一定有办法做到这一点 我可以为所有四个按钮创建自己的样式,然后对数据触发器执行此操作,但我更喜欢更通用的方法:对所有按钮使用相同的样式,这些样式根据按钮名称和属性值的不同而应用不同Wpf 根据XAML中的单个属性更改项集合的外观,wpf,data-binding,xaml,triggers,Wpf,Data Binding,Xaml,Triggers,我在网格中有4个按钮,其中datacontext被设置为一个对象,该对象的属性指示应该启用哪个按钮(它是可枚举的) 目前,我已经在代码隐藏中完成了这项工作,因此当特定属性发生更改时,它会根据值禁用除一个之外的所有属性。这是可行的,但我真的不喜欢把这样的东西放在代码后面。在xaml中一定有办法做到这一点 我可以为所有四个按钮创建自己的样式,然后对数据触发器执行此操作,但我更喜欢更通用的方法:对所有按钮使用相同的样式,这些样式根据按钮名称和属性值的不同而应用不同 提前感谢。您可以使用多重绑定将IsE
提前感谢。您可以使用多重绑定将IsEnabled属性绑定到控件名称和DataContext中属性的组合,并创建样式将其应用于网格中的所有按钮:
<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>
通过对枚举值进行整数引用并为相应的按钮提供这些枚举值,可以在已创建的
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;
}
}
绑定:
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;
}
}
哇。这正是我想要的。谢谢