我想要实现一个相对简单的事情,但我不确定该怎么做。基本上,我有一个CLR类如下:
class SomeClass
{
public SomeEnum Status;
}
public enum SomeEnum { One, Two, Three };
我有一个DataGrid,我通过代码隐藏以编程方式绑定ObservableCollection<SomeClass>
。在这个DataGrid中,我有一个包含两个按钮的DataGridTemplateColumn
,如下所示:
<toolkit:DataGridTemplateColumn Header="Actions">
<toolkit:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Button Content="ActionOne" />
<Button Content="ActionTwo" />
</StackPanel>
</DataTemplate>
</toolkit:DataGridTemplateColumn.CellTemplate>
</toolkit:DataGridTemplateColumn>
我想要做的是将这些按钮的IsEnabled属性绑定到基于{Binding Path = Status}的值的比较。例如,在伪代码中:
ActionOne.IsEnabled = BoundValue.Status != SomeEnum.Two
ActionTwo.IsEnabled = BoundValue.Status == SomeEnum.One || BoundValue.Status == SomeEnum.Two
有没有在XAML中这样做?另一种方法是为每个按钮编写一个值转换器,但由于按钮的内容和其他细节也可能不同,我不想最终写成6个值转换器。
干杯!
答案 0 :(得分:4)
你可以使用DataTrigger和下面的转换器一起使用。但是,Bryan的解决方案具有不使用多个转换器的好处,看起来这是您关注的问题之一,因此他的答案对您的场景可能更好。
<Button>
....
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="IsEnabled" Value="False" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Status, Converter={StaticResource yourConverter}}" Value="True">
<Setter Property="IsEnabled" Value="True" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
另一种选择是不使用DataTrigger并直接在IsEnabled属性中添加绑定:
<Button
IsEnabled="{Binding Path=Status, Converter={StaticResource yourConverter}}"
...
/>
答案 1 :(得分:4)
为什么不在执行比较逻辑的SomeClass中公开其他属性?
例如:
public bool ActionOneEnabled
{
get { return Status != SomeEnum.Two; }
}
然后,您可以轻松地将Button的IsEnabled绑定到相应的Property。
不要忘记在状态设置器中包含OnPropertyChanged(“ActionOneEnabled”),以便在状态更改时重新评估基于状态的属性。