基于比较的WPF绑定

基于比较的WPF绑定,wpf,data-binding,xaml,Wpf,Data Binding,Xaml,有一件相对简单的事情我正在努力实现,但我不确定如何做到。基本上,我有一个CLR类,如下所示: class SomeClass { public SomeEnum Status; } public enum SomeEnum { One, Two, Three }; <toolkit:DataGridTemplateColumn Header="Actions"> <toolkit:DataGridTemplateColumn.CellTemplate>

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

class SomeClass
{
    public SomeEnum Status;
}

public enum SomeEnum { One, Two, Three };
<toolkit:DataGridTemplateColumn Header="Actions">
    <toolkit:DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
    <StackPanel Orientation="Horizontal">
        <Button Content="ActionOne" />
        <Button Content="ActionTwo" />
    </StackPanel>
    </DataTemplate>
</toolkit:DataGridTemplateColumn.CellTemplate>
</toolkit:DataGridTemplateColumn>
我有一个DataGrid,我正在通过代码隐藏以编程方式绑定一个
ObservableCollection
。在这个DataGrid中,我有一个包含两个按钮的
DataGridTemplateColumn
,如下所示:

class SomeClass
{
    public SomeEnum Status;
}

public enum SomeEnum { One, Two, Three };
<toolkit:DataGridTemplateColumn Header="Actions">
    <toolkit:DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
    <StackPanel Orientation="Horizontal">
        <Button Content="ActionOne" />
        <Button Content="ActionTwo" />
    </StackPanel>
    </DataTemplate>
</toolkit:DataGridTemplateColumn.CellTemplate>
</toolkit:DataGridTemplateColumn>
在XAML中是否有这样做的方法?另一种选择是只为每个按钮编写一个值转换器,但由于按钮的内容和其他细节可能也会有所不同,因此我不希望最终编写成6个值转换器


干杯

您可以使用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}}"  
    ...  
/> 

为什么不在执行比较逻辑的某个类中公开其他属性

例:

然后可以轻松地将按钮的IsEnabled绑定到相应的属性


不要忘记在状态设置程序中包含OnPropertyChanged(“ActionOneEnabled”),以便在状态更改时重新评估基于状态的属性。

。虽然它肯定能工作并且代码量最少,但同时它在我的对象中包含UI信息。例如,如果我想使按钮的内容取决于状态,我必须将该信息放入我的SomeClass属性中,鉴于这应该是您关心的视图类/XAMLIf中的某个地方,那么您可能需要使用我提出的转换器方法。创建封装SomeClass并定义这些属性的SomeClassViewModel如何?然后,SomeClass就不知道UI关注点了。虽然在这一点上还不清楚这是否优于类型转换器。如果你担心的话,我猜课堂包装会更“可混合”。布莱恩,我喜欢这个解决方案。与转换器相比,我更喜欢类包装。