2011-11-02 36 views
0

我想有一个风格DataTrigger我window.resources可用于多种扩展里面一个数据触发。 DataTrigger绑定到我的ViewModel中的枚举值,并基于枚举值,我想要正确的扩展器被折叠。例如:如果枚举值设置为“A”,那么我只需要与类型“A”关联的扩展器可见,并且其余的扩展器将变为折叠状态。有多个控件

我在想是这样的:

<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控件设置的,那么你可以通过事件处理程序来完成它,或者在各个扩展程序上放置触发器。 – 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.BasedOn打造的依赖样式的层次结构:

<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

我无法得到这个工作。我需要的是一个枚举值(在我的viewmodel中)来设置3个控件的可见性。我能够通过听取我的viewmodel中的propertychanged事件,然后设置相应的控件,但无法确定是否存在直接的xaml解决方案。 –

+0

谢谢你指点我正确的方向。我能够解决这个问题,我发布的解决方案。 –