C# 需要帮助根据几个条件创建样式吗

C# 需要帮助根据几个条件创建样式吗,c#,wpf,C#,Wpf,我的WPF应用程序有一个视图模型对象,该对象具有基于两个不同int属性的多个布尔属性: public class MyViewModel : ModelBase { public int Class { get { return iClass; } set { iClass = value; OnPropertyChanged( "Class" ); OnPropertyChang

我的WPF应用程序有一个视图模型对象,该对象具有基于两个不同
int
属性的多个布尔属性:

public class MyViewModel : ModelBase {

    public int Class { 
        get { return iClass; }
        set {
            iClass = value;
            OnPropertyChanged( "Class" );
            OnPropertyChanged( "IsClass1" );
        }
    }
    private int iClass;

    public int Status { 
        get { return iStatus; }
        set {
            iStatus = value;
            OnPropertyChanged( "Status" );
            OnPropertyChanged( "IsStatus1" );
            OnPropertyChanged( "IsStatus2" );
            OnPropertyChanged( "IsStatus3" );
        }
    }
    private int iStatus;

    public bool IsClass1 {
        get { return Class == Class1; }
    }

    public bool IsStatus1 {
        get { return Status == Status1; }
    }

    public bool IsStatus2 {
        get { return Status == Status2; }
    }

    public bool IsStatus3 {
        get { return Status == Status3; }
    }

    // . . .
}
在显示这些
MyViewModel
对象的窗口中有一个
ListBox
。对象的数据包含一个图像,该图像显示为
边框
控件内的缩略图。
BorderBrush
BorderThickness
属性的值取决于从布尔属性派生的某些条件。在C#中,这些条件的代码如下所示:

string color = alarm.IsClass1  ? "BorderColor1" :
               alarm.IsStatus1 ? "BorderColor2" :
               alarm.IsStatus2 ? "BorderColor3" :
               alarm.IsStatus3 ? "BorderColor4" :
               "BorderColor5";
Border.SetResourceReference( BorderBrushProperty, color );
Border.BorderThickness = new Thickness( alarm.IsStatus1 || alarm.IsStatus3 ? 4.0 : 2.0 );
我想将其放入XAML中的
样式中,用于
列表框中使用的
数据模板

<DataTempate DataType="{x:Type local:MyViewModel}">
    <Border BorderBrush="Black"
            BorderThickness="2"
            HorizontalAlignment="Center" 
            Margin="5" 
            Height="100"
            Name="Border" 
            VerticalAlignment="Center" 
            Width="100">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Image Grid.Row="0" 
                   Name="AlarmImage" 
                   Source="{Binding Path=Image}" 
                   Stretch="Fill" />
            <local:ResponseTimer Expired="Timer_Expired"
                              Grid.Row="1"
                              HideIfStatus1="True"
                              IsTabStop="False"
                              MinHeight="10"
                              x:Name="TheTimer"
                              TimeoutPeriod="00:02:30"
                              VerticalAlignment="Bottom" />
        </Grid>
    </Border>
</DataTemplate>

我尝试了以下方法,但无效:

<Style TargetType="Border">
    <Setter Property="BorderBrush" Value="{DynamicResource BorderColor5}" />
    <Setter Property="BorderThickness" Value="2" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=IsStatus1}" Value="true">
            <Setter Property="BorderThickness" Value="4" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=IsStatus3}" Value="true">
            <Setter Property="BorderThickness" Value="4" />
        </DataTrigger>
            <DataTrigger Binding="{Binding Path=IsClass1}" Value="True">
            <Setter Property="BorderBrush" Value="{DynamicResource BorderColor1}" />
        </DataTrigger>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding Path=IsClass1}" Value="False" />
                <Condition Binding="{Binding Path=IsStatus1}" Value="True" />
            </MultiDataTrigger.Conditions>
            <Setter Property="BorderBrush" Value="{DynamicResource BorderColor2}" />
        </MultiDataTrigger>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding Path=IsClass1}" Value="False" />
                <Condition Binding="{Binding Path=IsStatus2}" Value="True" />
            </MultiDataTrigger.Conditions>
            <Setter Property="BorderBrush" Value="{DynamicResource BorderColor3}" />
        </MultiDataTrigger>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding Path=IsClass1}" Value="False"/>
                <Condition Binding="{Binding Path=IsStatus3}" Value="True" />
            </MultiDataTrigger.Conditions>
            <Setter Property="BorderBrush" Value="{DynamicResource BorderColor4}" />
        </MultiDataTrigger>
    </Style.Triggers>
</Style>


我做错了什么?

视图模型应该是视图的模型。因此,请为其提供所需视图的正确模型。我的意思是在视图模型中保留复杂的逻辑,并将其作为简单的
bool
属性公开

public bool IsCombinedCondition1 { get; set; } // Implement INotifyPropertyChanged
...
public bool IsCombinedConditionN { get; set; } // Implement INotifyPropertyChanged
然后,您可以对每个组合条件使用一个简单的
DataTrigger
,将它们与底部最重要的条件一起排序,因为在XAML中声明较低的条件将覆盖声明较高的条件:

<DataTrigger Binding="{Binding Path=IsCombinedCondition1}" Value="true">
    <Setter Property="BorderBrush" Value="{DynamicResource BorderColor1}" />
</DataTrigger>
...
<DataTrigger Binding="{Binding Path=IsCombinedConditionN}" Value="true">
    <Setter Property="BorderBrush" Value="{DynamicResource BorderColorN}" />
</DataTrigger>

...

您也可以使用
enum
。无论哪种方式,都最好保持UI尽可能简单,并在视图模型中保留复杂的功能。

在这种情况下,您可能希望使用值或多值转换器。