Наличие одного триггера данных для нескольких элементов управления

Я хочу иметь один Style 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>

person d.moncada    schedule 02.11.2011    source источник
comment
У кого-то может быть ответ для вас, но я не думаю, что XAML будет поддерживать такой уровень логики. Это больше похоже на инструкцию прямого перехода к экрану. Если значение Enum установлено с помощью элемента управления пользовательского интерфейса, вы можете сделать это с помощью обработчика событий или поместить триггеры в отдельные расширители.   -  person paparazzo    schedule 02.11.2011


Ответы (2)


Я полагаю, что вы сможете вручную настроить стили для каждого конкретного класса 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}"/>
person sll    schedule 02.11.2011
comment
Я собираюсь попробовать это и посмотреть, сработает ли это. Спасибо за помощь. - person d.moncada; 03.11.2011
comment
Я не смог заставить это работать. мне нужно одно значение перечисления (в моей модели представления), чтобы установить видимость 3 элементов управления. Я смог сделать это, прослушав событие propertychanged внутри моей модели представления из кода программной части, а затем соответствующим образом настроив элементы управления, но не был уверен, существует ли прямое решение xaml. - person d.moncada; 03.11.2011
comment
Спасибо, что указали мне правильное направление. Я смог решить это с помощью решения, которое я опубликовал. - person d.moncada; 03.11.2011

Я смог решить эту проблему (используя несколько триггеров) со статическим ресурсом, из-за которого каждый элемент управления «сворачивался», а затем имел отдельные «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>
person d.moncada    schedule 03.11.2011