Как связать управляющий текст WPF с логическим значением и принять решение о тексте в xaml - PullRequest
0 голосов
/ 26 мая 2018

У меня есть кнопка управления в приложении WPF, которое используется для входа в систему.Кнопка имеет двойное назначение: при выходе из системы на ней должен отображаться текст «войти».При входе в систему должен отображаться текст «log out».

Я мог бы сделать это с привязкой данных к соответствующему строковому свойству в viewmodel.Но было бы лучше, если бы я мог просто связать данные с логическим значением "loggedIn" (false для выхода из системы, true для входа в систему), а затем принять решение о том, какой текст отображать на кнопке из представления.

Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Вы можете достичь этого, используя Style в Xaml без написания специального кода на C #.

Предположим, у вас есть свойство IsLoggedIn в ViewModel, которое изменяется в методе выполнения команды связывания кнопок:

private void MyButtonCommandExecuteMethod()
{
    this.IsLoggedIn = !this.IsLoggedIn;
}

private bool isLoggedIn;
public bool IsLoggedIn
{
    get
    {
        return this.isLoggedIn;
    }

    set
    {
        this.isLoggedIn = value;
        OnPropertyChanged(nameof(IsLoggedIn));
    }
}

В приведенном выше коде OnPropertyChanged - реализация метода INotifyPropertyChanged s PropertyChanged событие.Если вы используете какой-либо фреймворк или определили собственное имя, замените его соответствующим именем.

Вы можете определить такой стиль, как:

<Button Command="{Binding YourButtonCommand}">
    <Button.Style>
        <Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
            <Setter Property="Content" Value="Log In" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsLoggedIn}" Value="True">
                    <Setter Property="Content" Value="Log out" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

В приведенном выше коде IsLoggedIn привязывается кDataTrigger для обновления свойства Button Content на основе его значения.

Другой момент, стиль кнопки наследуется от стиля по умолчанию.Если вы используете какой-либо стиль Keyed, используйте его в BasedOn Property.

0 голосов
/ 26 мая 2018

Решение

Да, это возможно при использовании преобразователя значений, в частности IValueConverter.Вы можете привязать свойство bool, скажем BoolProperty, от вашего viewmodel до button, используя такой конвертер.

<Button Content="{Binding BoolProperty, Converter={StaticResource BoolConverter}}" />

Шаг 1: Вам необходимо создать конвертер, который будет принимать значение boolи вернуть любую строку по вашему желанию.

public class BoolConverter : System.Windows.Data.IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is bool)
        {
            return value.ToString();
        }
        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Шаг 2: Объявите этот конвертер как ресурс в XAML (вам нужно будет определить local псевдоним пространства имен, который содержит конвертер в вашем <Window ..> начальном элементе.

<local:BoolConverter x:Key="BoolConverter" />

Так что теперь, когда событие измененного свойства вызывается для BoolProperty, этот преобразователь срабатывает, и текст button изменяется соответствующим образом.

Предложение :

Я не уверен, почему вы думаете, что сохранение дополнительного свойства string не является чистым способом. Это чистый и намного более простой подход, чем использование конвертера. Все, что я показал, является ненужными накладными расходами для вашего случая, IMOОднако, так как вы спросили о возможности, я подробно изложил это. Выбор за вами! :) 1030 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...