2014-03-05 4 views
0

내 WPF 응용 프로그램이 두 개의 서로 다른 int 속성을 기반으로 여러 부울 속성을 가진보기 모델 개체가 기반으로 스타일을 만드는 데 도움이 필요 사물. 개체의 데이터에는 Border 컨트롤 안에 미리보기 이미지로 표시되는 이미지가 포함되어 있습니다. BorderBrushBorderThickness 속성 값은 부울 속성에서 파생 된 일부 조건에 따라 다릅니다. C#에서, 이러한 조건에 대한 코드는 다음과 같습니다는 몇 가지 조건

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

나는 시도 :

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

내가 ListBox에서 사용되는 DataTemplate에 대한 XAML에 Style에이를 데려 가고 싶다는 다음과 같이 작동하지만 작동하지 않습니다.

<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 

그럼 당신은 사람이 낮은이 사람은 XAML에서 높은 선언보다 우선합니다 선언, 하단의 가장 중요한 조건을 주문, 각각의 결합 상태에 대한 간단한 DataTrigger를 사용할 수 있습니다

<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를 최대한 단순하게 유지하고 뷰 모델에서 복잡한 기능을 유지하는 것이 가장 좋습니다.