基于比较的WPF绑定

时间:2010-01-07 01:35:27

标签: wpf data-binding xaml

我想要实现一个相对简单的事情,但我不确定该怎么做。基本上,我有一个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个值转换器。

干杯!

2 个答案:

答案 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”),以便在状态更改时重新评估基于状态的属性。