Uwp - преобразователь логических значений в видимость не работает

Я не понимаю, почему что-то такое простое доставляет мне столько проблем, но все же. У меня есть такой конвертер:

public class BoolToVisibleConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value is bool && (bool)value)
            return Visibility.Visible;

        return Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        return (value is Visibility && (Visibility)value == Visibility.Visible);
    }
}

и эта модель просмотра:

public class LoginViewModel: INotifyPropertyChanged
{
    private bool isHowToVisibile;

    public bool IsHowToVisible
    {
        get { return isHowToVisibile; }
        set { isHowToVisibile = value; Notify(nameof(IsHowToVisible)); }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void Notify(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public void ShowHowTo()
    {
        IsHowToVisible = true;
    }
}

В XAML у меня есть кнопка, которая активирует ShowHowTo и меняет IsHowToVisible на true, и StackPanel, видимость которого я привязываю к свойству модели представления IsHowToVisible, это выглядит так:

<AppBarButton Label = "How To Play" Icon = "Help" Click = "{x:Bind loginViewModel.ShowHowTo}"/>

<StackPanel Name = "HowTo" Grid.ColumnSpan = "3" Grid.RowSpan = "6" Visibility = "{x:Bind loginViewModel.IsHowToVisible,Converter = {StaticResource boolToVis},Mode=OneWay}">
    <Button Name = "CloseHowTo" Content = "Close" Click = "CloseHowTo_Click" HorizontalAlignment = "Center" VerticalAlignment = "Center" Margin = "10,10,10,10"/>
    <Image  Source = "Assets/HowTo.jpg"  Stretch = "Fill" Margin = "10,10,10,10"/>
</StackPanel>

XAML знает преобразователь следующим образом:

xmlns:con = "using:MyApp.Converters"

<Page.Resources>
    <con:BoolToVisibleConverter x:Key = "boolToVis"/>
</Page.Resources>

Кнопка работает. Прогулка с отладчиком показывает, что свойство в модели представления действительно изменилось на true, и событие PropertyChanged действительно сработало. Но это все. Я поставил точку останова в конвертере, и он не попал.

Пробовал пересобрать и развернуть, поменять режим на Mode=TwoWay, ничего не помогает.

Что я делаю неправильно?

x:Bind по умолчанию - OneTime, оценивается только один раз. Если начальное значение свойства истинно, будет ли вызываться конвертер и конвертировать true в Visible? Если это так, преобразователь работает должным образом. Затем измените режим на OneWay или TwoWay - ваш код работает в любом случае.
kennyzx 27.07.2018 09:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
1 145
1

Ответы 1

В моем тесте приведенный выше код работает хорошо, пожалуйста, убедитесь, что вы можете Перейти к определению (или F12), когда вы сосредотачиваетесь на <con:BoolToVisibleConverter /> xaml.

С другой стороны, если ваше приложение нацелено на Windows 10 версии 1607 и более поздних версий, вы можете удалить свой код BoolToVisibleConverter и не использовать Convert в вашем xaml. Начиная с Windows 10 версии 1607, платформа XAML предоставляет встроенный преобразователь логических значений в видимость. Конвертер сопоставляет true со значением перечисления Visible и false со значением Collapsed, поэтому вы можете связать свойство Visibility с логическим значением без создания конвертера. Обратите внимание, что это не функция привязки функций, а только привязка свойств. Для использования встроенного конвертера минимальная целевая версия SDK вашего приложения должна быть 14393 или более поздней. Вы не можете использовать его, если ваше приложение нацелено на более ранние версии Windows 10.

Если у вас все еще есть эта проблема, вы можете создать минимальный образец, который мог бы ее воспроизвести.

Другие вопросы по теме