2011-11-02 44 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

謝謝你指點我正確的方向。我能夠解決這個問題,我發佈的解決方案。 –