Как заставить определенный GoToStateAction-with-DataTrigger работать, когда элемент загружен - PullRequest
3 голосов
/ 06 августа 2010

У меня есть DataTemplate.У него два визуальных состояния - Развернуто, Свернуто.Я добавил 2 GoToStateAction-s.Первый из них переходит в расширенное состояние, когда свойство контекста данных становится истинным, а второй - в свернутое состояние, когда это же свойство становится ложным.

Флажок является частью шаблона и привязан к этому свойству,Поэтому, когда флажок установлен / снят, происходит необходимый переход.

Но ни одно из действий не применяется при запуске.Флажок установлен, но расширенное визуальное состояние не применяется.

Возможно ли с помощью диспетчера визуальных состояний все элементы, загруженные с состояниями, применены в соответствии со значениями свойств?

Ответы [ 3 ]

2 голосов
/ 22 июня 2012

Похоже, вам нужно переопределить OnApplyTemplate и вызвать VisualStateManager.GoToState ().Произошло то, что ваш элемент управления был загружен, произошла привязка данных, а затем был применен шаблон.Таким образом, шаблон находится в базовом состоянии, потому что ничто не говорит ему о выполнении перехода состояния.Возможно, вы сможете сделать все это из XAML, подключившись к загруженному событию, но вам может показаться, что оно нестабильно.

0 голосов
/ 09 июня 2016

У меня есть похожая проблема, что визуальное состояние с привязкой не применяется к загрузке вида:

<core:PropertyChangedTrigger Binding="{Binding State}">
    <core:GoToStateAction StateName="{Binding State}" />
</core:PropertyChangedTrigger>

Поскольку я использую архитектуру MVVM, я не могу переопределить OnApplyTemplate представления, поскольку представление не может «видеть» ViewModel.

Наконец, я обнаружил, что EventTrigger помогает, и я хочу поделиться им с вами:

<interactivity:Interaction.Triggers>
    <interactivity:EventTrigger>
        <core:GoToStateAction StateName="{Binding State}" />
    </interactivity:EventTrigger>
    <core:PropertyChangedTrigger Binding="{Binding State}">
        <core:GoToStateAction StateName="{Binding State}" />
    </core:PropertyChangedTrigger>
</interactivity:Interaction.Triggers>

где xmlns: interactivity = "http://schemas.microsoft.com/expression/2010/interactivity"

0 голосов
/ 06 августа 2010

Вам просто нужно добавить еще один GoToStateAction, который устанавливает желаемые состояния при срабатывании события OnLoad.

update

Я не проверял это, но думаю, вы могли быиспользуйте пользовательский TargetedTriggerAction, производный от GoToStateAction:

public class GoToStateIfCheckedAction : GoToStateAction
{
    protected override void Invoke(object parameter)
    {
        var toggleButton = Target as ToggleButton;
        if (toggleButton != null && (!toggleButton.IsChecked.HasValue || !toggleButton.IsChecked.Value))
        {
            // if the Target is a ToggleButton, and it is in an indeterminate or unchecked state, don't invoke
            return;
        }

        // if the Target is not a ToggleButton, or if the ToggleButton is checked, go ahead and invoke the action
        base.Invoke(parameter);
    }
}

При присоединении к ToggleButton, например CheckBox, это действие будет выполняться только тогда, когда IsChecked == true.

Вы можете вызвать это из события OnLoad, и оно перейдет в состояние, если флажок установлен, или ничего не делать, если не отмечено.

...