Разрешить активацию только одного xaml Datatrigger за один раз - PullRequest
0 голосов
/ 28 января 2019

У меня есть ControlTemplate, который содержит состояние устройства.В этом состоянии может отображаться программа устройства, которая состоит из трех этапов.Регулярность свойства индекса анимации составляет от 1 до 3 и выше.Также устройство может выполнять три операции, которые не зависят от программы.Однако программа должна иметь более высокий приоритет.Операция1 и Операция2 не могут выполняться одновременно.Операция 3 должна иметь самый низкий приоритет.Когда ни операция, ни программа не активны, элемент управления остается пустым.

С помощью устройства сбора данных я меняю видимость холстов в зависимости от состояния.Я хочу разрешить одновременное срабатывание только одного триггера.На данный момент мне нужно много кода, чтобы свернуть невидимые части.Также я полагаюсь на порядок проверки условий: сверху вниз в коде.Это плохой стиль. (Которого можно избежать даже с помощью большего количества кода)

1 Ответ

0 голосов
/ 06 февраля 2019

Как предложено @P.Manthe Установите Visibility="Collapsed" по умолчанию для всех холстов и установите Property="Visibility" Value="Visible" для холста, который должен быть видимым

<ControlTemplate>
    <Viewbox Width="30" Height="24" Stretch="Uniform" HorizontalAlignment="Right" VerticalAlignment="Top">
        <Canvas Background="{TemplateBinding Background}" Width="30.6667" Height="26.6667">
            <Canvas x:Name="deviceProgramIdle"Visibility="Collapsed">
                    ...
            </Canvas>
            <Canvas x:Name="deviceProgramStepA" Width="30.6667" Height="26.6667" Visibility="Collapsed">
                    ...
            </Canvas>
            <Canvas x:Name="deviceProgramStepB" Width="30.6667" Height="26.6667" Visibility="Collapsed">
                    ...
            </Canvas>
            <Canvas x:Name="deviceProgramStepC" Width="30.6667" Height="26.6667" Visibility="Collapsed">
                    ...
            </Canvas>
            <Canvas x:Name="deviceOperation1" Visibility="Collapsed">
                    ...
            </Canvas>
            <Canvas x:Name="deviceOperation2" Height="24" Width="30" Visibility="Collapsed">
                    ...
            </Canvas>
            <Canvas x:Name="deviceOperation3" Width="30.6667" Height="26.6667" Visibility="Collapsed">
                    ...
            </Canvas>
        </Canvas>
    </Viewbox>
    <ControlTemplate.Triggers>
        <DataTrigger Binding="{Binding DeviceViewModel.IsOperation1Active, Mode=OneWay}" Value="true">
            <Setter TargetName="deviceOperation1" Property="Visibility" Value="Visible"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding DeviceViewModel.IsOperation2Active, Mode=OneWay}" Value="true">
            <Setter TargetName="deviceOperation2" Property="Visibility" Value="Visible"/>
        </DataTrigger>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding DeviceViewModel.IsOperation1Active, Mode=OneWay}" Value="true"/>
                <Condition Binding="{Binding DeviceViewModel.IsOperation2Active, Mode=OneWay}" Value="false"/>
                <Condition Binding="{Binding DeviceViewModel.IsOperation3Active, Mode=OneWay}" Value="false"/>
            </MultiDataTrigger.Conditions>
            <Setter TargetName="deviceOperation3" Property="Visibility" Value="Visible"/>
        </MultiDataTrigger>
        <DataTrigger Binding="{Binding AnimationIndex, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type devic:DeviceProgram}}, Mode=OneWay}" Value="1">
            <Setter TargetName="deviceProgramStepA" Property="Visibility" Value="Visible"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding AnimationIndex, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type devic:DeviceProgram}}, Mode=OneWay}" Value="2">
            <Setter TargetName="deviceProgramStepB" Property="Visibility" Value="Visible"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding AnimationIndex, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type devic:DeviceProgram}}, Mode=OneWay}" Value="3">
            <Setter TargetName="deviceProgramStepC" Property="Visibility" Value="Visible"/>
        </DataTrigger>
    </ControlTemplate.Triggers>
</ControlTemplate>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...