【问题标题】:Having one data trigger for multiple controls一个数据触发器用于多个控件
【发布时间】:2011-12-20 14:28:50
【问题描述】:

我想在我的 window.resources 中有一个 Style DataTrigger 可用于多个扩展器。 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>

【问题讨论】:

  • 有人可能会为您解答,但我认为 XAML 不会支持该级别的逻辑。它更像是直接通过屏幕指令。如果枚举值是通过 UI 控件设置的,那么您可以使用事件处理程序或将触发器放在各个扩展器上。

标签: .net wpf xaml datatrigger


【解决方案1】:

我相信您可以为每个具体的 Expander 类手动设置样式,以避免触发代码重复,您可以使用 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}"/>

【讨论】:

  • 我要试试这个,看看它是否有效。感谢您的帮助。
  • 我无法让它工作。我需要的是一个枚举值(在我的视图模型中)来设置 3 个控件的可见性。我可以通过从代码隐藏中侦听视图模型中的 propertychanged 事件然后相应地设置控件来做到这一点,但不确定是否有直接的 xaml 解决方案。
  • 感谢您为我指明了正确的方向。我能够用我发布的解决方案解决这个问题。
【解决方案2】:

我能够使用静态资源解决此问题(使用多个触发器),该静态资源导致每个控件“折叠”,然后在每个控件内具有单独的“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>

【讨论】:

    猜你喜欢
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 2019-03-28
    • 2017-11-25
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    相关资源
    最近更新 更多