2011-11-02 2 views
0

여러 개의 확장기에 사용할 수있는 내 window.resources 내에 하나의 Style DataTrigger를 갖고 싶습니다. DataTrigger는 내 ViewModel 내부의 열거 형 값에 바인딩되며 열거 형 값에 따라 올바른 확장자를 축소해야합니다. 예 : 열거 형 값이 "A"로 설정된 경우 "A"유형과 연관된 확장기 만 표시되고 나머지 확장기는 축소됩니다.여러 컨트롤에 대해 하나의 데이터 트리거가 있습니다.

나는 이런 식의 생각 : 나는 당신이 의존하는 스타일의 계층 구조를 구축 할 수 Style.BasedOn를 사용할 수있는 트리거 코드 중복을 피하기 위해 각 콘크리트 확장기 클래스의 수를 수동으로 설치 스타일, 될 생각

<Style TargetType="{x:Type Expander}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Type}" Value="A"> 
       // In here i would set the expander associated w/ "A" to Visible 
       // and have the rest of the expanders collapsed. Since TargetName is 
       // not allowed within a "Setter" property of a style, I am not sure on how to accomplish this. 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Type}" Value="B"> 
       // Same concept as above 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
+0

누군가가 당신을 위해 대답을 할 수 있지만 XAML은 논리의 수준을 지원하는 것입니다 생각하지 않습니다

(나는이 예에서는 캔버스를 사용) 아래를 참조하십시오. 그것은 화면 지시에 대한 직접적인 전달 이상의 역할을합니다. Enum 값이 UI 컨트롤을 통해 설정되면 이벤트 처리기로 수행하거나 개별 Expanders에 트리거를 넣을 수 있습니다. – Paparazzi

답변

0

어디서 관련된 열거 값 원인 각 제어 내측이 별도 'DataTriggers'을 갖는 다음 '축소'각 제어 의한 정적 자원으로 (다중의 트리거를 사용하여)하고 해결할 수 있었다 가시성이 '가시성'이됩니다.

<Grid> 
    <Grid.Resources>   
     <Style x:Key="CanvasStyle"> 
      <Setter Property="Canvas.Visibility" Value="Collapsed"/> 
     </Style> 
    </Grid.Resources> 
    <ComboBox IsSynchronizedWithCurrentItem="True" Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="comboBox1" VerticalAlignment="Top" Width="153" ItemsSource="{Binding IDs}" MaxDropDownHeight="75" SelectedValue="{Binding SelectedValue}"/> 
    <StackPanel Height="128" HorizontalAlignment="Left" Orientation="Horizontal"> 
     <Canvas Height="100" Name="canvas1" Width="100" Background="#FFC70D0D"> 
      <Canvas.Style> 
       <Style BasedOn="{StaticResource CanvasStyle}"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Type}" Value="A"> 
          <Setter Property="Canvas.Visibility" Value="Visible" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Canvas.Style> 
     </Canvas> 
     <Canvas Background="#FF63C70D" Height="100" Name="canvas2" Width="100"> 
      <Canvas.Style> 
       <Style BasedOn="{StaticResource CanvasStyle}"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Type}" Value="B"> 
          <Setter Property="Canvas.Visibility" Value="Visible" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Canvas.Style> 
     </Canvas> 
     <Canvas Background="#FF0D55C7" Height="100" Name="canvas3" Width="100"> 
      <Canvas.Style> 
       <Style BasedOn="{StaticResource CanvasStyle}"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Type}" Value="C"> 
          <Setter Property="Canvas.Visibility" Value="Visible" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Canvas.Style> 
     </Canvas> 
    </StackPanel> 
</Grid> 
0

을 :

<Style x:key=ExpanderBaseStyle" TargetType="{x:Type Expander}"> 
    <!-- trigger logic --> 
</Style> 

<Style TargetType="{x:Type FirstExpander}" 
        BasedOn="{StaticResource ExpanderBaseStyle}"/> 

<Style TargetType="{x:Type SecondExpander}" 
        BasedOn="{StaticResource ExpanderBaseStyle}"/> 
+0

나는 이것을 시험해보고 효과가 있는지 알아볼 것입니다. 도와 주셔서 감사합니다. –

+0

이 작업을 수행 할 수 없습니다. 내가 필요한 것은 3 개의 컨트롤의 가시성을 설정하는 하나의 enum 값 (내 viewmodel)입니다. 나는 코드 숨김에서 내 viewmodel 안의 propertychanged 이벤트를 듣고 그에 따라 컨트롤을 설정했지만 직접 xaml 솔루션이 있는지 확실하지는 않았다. –

+0

올바른 방향으로 나를 가르쳐 주셔서 감사합니다. 내가 게시 한 솔루션으로이 문제를 해결할 수있었습니다. –

관련 문제