Запускать VisualState, когда значение свойства bool изменяется на true (и игнорировать, когда изменяется на false)

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

Narrow в первую очередь предназначен для использования с окнами размером менее 720 пикселей и широким, когда больше. Однако, кроме того, если открыт только один файл, я хочу, чтобы узкое состояние пользовательского интерфейса использовалось независимо от размера окна (т.е. даже если оно> = 720 пикселей).

У меня есть свойство bool, которое отслеживает, открыто ли более одного файла:

    private bool _moreThan1FileOpen = false;
    public bool MoreThan1FileOpen
    {
        get { return _moreThan1FileOpen; }
        set
        {
            _moreThan1FileOpen = value;
        }
    }

Но мне не удалось связать триггер VisualState со значением этого свойства, т. Е. Если true, перейти в это состояние, а если false, перейти к следующему VisualState.

Будем очень признательны за любые рекомендации о том, как я могу достичь этого с помощью VisualState.StateTriggers.

--

Как посоветовал dotMorten, я изменил средство задания свойств, чтобы вызвать событие PropertyChanged, а также свойство int:

private bool _numFilesOpen = 0;
public bool NumFilesOpen
{
    get { return _numFilesOpen; }
    set
    {
        _numFilesOpen = value;
        RaisePropertyChanged("NumFilesOpen");
    }
}

В идеале я бы работал с двумя состояниями:

        <VisualState x:Name="WideState">
            <VisualState.StateTriggers>
                <triggers:CompositeStateTrigger Operator="And">
                    <triggers:CompareStateTrigger Value="{Binding NumFilesOpen}" CompareTo="1" Comparison="GreaterThan" />
                    <triggers:CompareStateTrigger Value="{Binding WindowWidth}" CompareTo="719" Comparison="GreaterThan" />
</VisualState.StateTriggers>

        <VisualState x:Name="NarrowState">
            <VisualState.StateTriggers>
                <AdaptiveTrigger MinWindowWidth="0" />
            </VisualState.StateTriggers>

Однако триггер составного состояния, похоже, не работает, поэтому я получил 3 состояния:

        <VisualState x:Name="NarrowStatee">
            <VisualState.StateTriggers>
                <triggers:CompareStateTrigger Value="{Binding NumFilesOpen}" CompareTo="2" Comparison="LessThan" />
            </VisualState.StateTriggers>

        <VisualState x:Name="WideState">
            <VisualState.StateTriggers>
                <AdaptiveTrigger MinWindowWidth="720" />
            </VisualState.StateTriggers>

    <VisualState x:Name="NarrowState">
        <VisualState.StateTriggers>
            <AdaptiveTrigger MinWindowWidth="0" />
        </VisualState.StateTriggers>

person Barrrdi    schedule 04.01.2017    source источник


Ответы (1)


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

т.е. реализуйте INotifyPropertyChanged в своем интерфейсе, затем в установщике вызовите PropertyChanged? .Invoke (это, новый PropertyChangedEventArgs (nameof (MoreThan1FileOpen)));

person dotMorten    schedule 04.01.2017
comment
На самом деле только что понял, что сравниваю bool с int! Позвольте мне сначала разобраться с этим .. - person Barrrdi; 04.01.2017
comment
Снова обновлен с не самым предпочтительным решением, но, по крайней мере, решением! - person Barrrdi; 04.01.2017