2014-03-05 26 views
0

我的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对象。该对象的数据包含一个图像,该图像在Border控件内显示为缩略图。 BorderBrushBorderThickness属性的值取决于从布尔属性派生的一些条件。在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); 

我想把这变成Style在XAML为在ListBox使用的DataTemplate

<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> 

我在做什么错?

+1

在这种情况下,您可能想要一个值或多值转换器。 –

回答

0

视图模型应该是视图的模型。因此,请为您提供正确的视图模型。我的意思是保持视图模型中的复杂逻辑并将其作为简单的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。无论采用哪种方式,最好尽可能简化界面,并将复杂的功能保留在视图模型中。