WPF Реализация условий, соблюдая паттерн MVVM

118
12 января 2021, 02:50

Подскажите как реализовать в WPF приложении условия. Например, я хочу, чтобы в зависимости от текста одного TextBlock'a изменялся цвет текста другого текстблока, при этом соблюдая MVVM. Мой вопрос относится не только к данном примеру, а к тому, как в целом менять что-то, при выполнении определенного условия. Подскажите как эти условия задать и как их применить к определенному элементу.

Answer 1

Создаем ViewModel с текстовым полем

public class MainViewModel : INotifyPropertyChanged
{
    private string _viewModelText;
    public string ViewModelText
    {
        get => _viewModelText;
        set
        {
            if (value == _viewModelText) return;
            _viewModelText = value;
            OnPropertyChanged();
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Пишем конвертер из строки в цвет

public class StringToBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var str = value as string;
        if (string.IsNullOrEmpty(str)) return new SolidColorBrush(Colors.White);
        var colors = typeof(Colors).GetProperties().ToDictionary(pi => pi.Name, co => (Color)co.GetValue(null));
        if (colors.ContainsKey(str)) return new SolidColorBrush(colors[str]);
        return new SolidColorBrush(Colors.White);
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Создаем окно с текстовым полем и биндим на модель

<Window x:Class="RU_986676.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:RU_986676"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <local:StringToBrushConverter x:Key="StringToBrushConverter"></local:StringToBrushConverter>
    </Window.Resources>
    <Grid Background="{Binding ViewModelText, Converter={StaticResource StringToBrushConverter}}">
        <TextBox Text="{Binding ViewModelText, UpdateSourceTrigger=PropertyChanged}" Width="300" Height="40"></TextBox>
    </Grid>
</Window>

Запускаем всю эту радость

Все исходники ищите тут

READ ALSO
Получение информации о мониторах без WinForms

Получение информации о мониторах без WinForms

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

111
Ошибка при компиляции CS1061

Ошибка при компиляции CS1061

Компилятор пишет сообщение:

134
Добавление данных в БД из DTO

Добавление данных в БД из DTO

У меня есть класы entities для представление данных в БД и соответствующие DTO для передачи данных между слоями приложения

107