C# 需要帮助根据几个条件创建样式吗
我的WPF应用程序有一个视图模型对象,该对象具有基于两个不同C# 需要帮助根据几个条件创建样式吗,c#,wpf,C#,Wpf,我的WPF应用程序有一个视图模型对象,该对象具有基于两个不同int属性的多个布尔属性: public class MyViewModel : ModelBase { public int Class { get { return iClass; } set { iClass = value; OnPropertyChanged( "Class" ); OnPropertyChang
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尽可能简单,并在视图模型中保留复杂的功能。在这种情况下,您可能希望使用值或多值转换器。