基于比较的WPF绑定

soh*_*hum 4 data-binding wpf xaml

我想要实现一个相对简单的事情,但我不确定如何做到。基本上,我有一个 CLR 类,如下所示:

class SomeClass
{
    public SomeEnum Status;
}

public enum SomeEnum { One, Two, Three };
Run Code Online (Sandbox Code Playgroud)

我有一个 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>
Run Code Online (Sandbox Code Playgroud)

我想要做的是将这些按钮的 IsEnabled 属性绑定到基于 {Binding Path=Status} 的值的比较。例如,在伪代码中:

ActionOne.IsEnabled = BoundValue.Status != SomeEnum.Two
ActionTwo.IsEnabled = BoundValue.Status == SomeEnum.One || BoundValue.Status == SomeEnum.Two
Run Code Online (Sandbox Code Playgroud)

无论如何,可以在 XAML 中执行此操作吗?另一种方法是为每个按钮编写一个值转换器,但由于按钮的内容和其他细节也可能有所不同,因此我不想最终编写类似 6 个值转换器的代码。

干杯!

Bry*_*der 6

为什么不在 SomeClass 中公开执行比较逻辑的附加属性?

前任:

public bool ActionOneEnabled
{
    get { return Status != SomeEnum.Two; }
}
Run Code Online (Sandbox Code Playgroud)

然后您可以轻松地将 Button 的 IsEnabled 绑定到适当的 Property。

不要忘记在 Status 的 setter 中包含 OnPropertyChanged("ActionOneEnabled") - 这样当您的 Status 更改时,会重新评估基于 Status 的属性。