Как сбросить цвет фона по умолчанию в MVVM? - PullRequest
0 голосов
/ 21 октября 2019

Я создаю страницу входа в UWP, используя MVVM. Когда введен неверный пароль, я хочу, чтобы граница PasswordBox была изменена на красный, чтобы указать, что он неверен.

Я связал переменную SolidColorBrush с полями Border и Background.

        private SolidColorBrush _validationColorBorder;
        public SolidColorBrush ValidationColorBorder
        {
            get{ return _validationColorBorder; }
            set
            {
                _validationColorBorder = value;
                RaisePropertyChanged();
            }
        }

        private SolidColorBrush _validationColorBackground;
        public SolidColorBrush ValidationColorBackground
        {
            get { return _validationColorBackground; }
            set
            {
                _validationColorBackground = value;
                RaisePropertyChanged();
            }
        }

в ViewModel я устанавливаю цвета для проверки цветов, используя это:

            ValidationColorBackground = (SolidColorBrush)Application.Current.Resources["TextBoxBackgroundThemeBrush"];
            ValidationColorBorder = (SolidColorBrush)Application.Current.Resources["TextBoxBorderThemeBrush"];

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

Как бы я сменил настройку цветов на цвета по умолчанию для моего приложения? И быть в состоянии сделать это в формате MVVM, установив мои переменные SolidColorBrush в эти цвета по умолчанию?

Спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 22 октября 2019

Как сбросить цвет фона по умолчанию в MVVM?

Пожалуйста, проверьте стиль PasswrodBox. Цвет фона и границы по умолчанию: TextControlBackground и TextControlBorderBrush. Таким образом, вы можете получить их, прежде чем устанавливать собственный цвет.

defaultBgColor = (SolidColorBrush)Application.Current.Resources["TextControlBackground"];
defaultBorderColor = (SolidColorBrush)Application.Current.Resources["TextControlBorderBrush"];

Если вы хотите выполнить откат ,, вам просто нужно скопировать указанное выше значение в свое свойство привязки. Для получения дополнительной информации, пожалуйста, обратитесь к следующему.

public class ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private SolidColorBrush defaultBgColor;
    private SolidColorBrush defaultBorderColor;

    public ViewModel()
    {
        defaultBgColor = (SolidColorBrush)Application.Current.Resources["TextControlBackground"];
        defaultBorderColor = (SolidColorBrush)Application.Current.Resources["TextControlBorderBrush"];

        ValidationColorBackground = (SolidColorBrush)Application.Current.Resources["TextBoxBackgroundThemeBrush"];
        ValidationColorBorder = (SolidColorBrush)Application.Current.Resources["TextBoxBorderThemeBrush"];
    }
    private SolidColorBrush _validationColorBorder;
    public SolidColorBrush ValidationColorBorder
    {
        get { return _validationColorBorder; }
        set
        {
            _validationColorBorder = value;
            RaisePropertyChanged();
        }
    }

    private void RaisePropertyChanged([CallerMemberName] string propertyName = null)
    {
        this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    private SolidColorBrush _validationColorBackground;
    public SolidColorBrush ValidationColorBackground
    {
        get { return _validationColorBackground; }
        set
        {
            _validationColorBackground = value;
            RaisePropertyChanged();
        }
    }

    public ICommand BtnClickCommand
    {
        get
        {
            return new RelayCommand(() =>
            {
                ValidationColorBackground = defaultBgColor;
                ValidationColorBorder = defaultBorderColor;
            });
        }
    }

}
0 голосов
/ 24 октября 2019

Вы можете использовать Bevaviours для достижения этой цели. Вам понадобится свойство для привязки ошибок.

Вам также потребуется создать несколько стилей

См. Пример (=> взят из Prism)

using Microsoft.Xaml.Interactivity;
using Prism.Windows.Validation;
using System.Collections.ObjectModel;
using System.Linq;
using Windows.UI.Xaml;

namespace ams.TaskmanagerClient.Behaviors
{
   Public Class HighlightFormFieldOnErrors : Behavior<FrameworkElement>
    {
        Public ReadOnlyCollection<String> PropertyErrors
        {
            Get { return (ReadOnlyCollection<String>)GetValue(PropertyErrorsProperty); }
            Set { SetValue(PropertyErrorsProperty, value); }
        }

        Public String HighlightStyleName
        {
            Get { return (String)GetValue(HighlightStyleNameProperty); }
            Set { SetValue(HighlightStyleNameProperty, value); }
        }

        Public String OriginalStyleName
        {
            Get { return (String)GetValue(OriginalStyleNameProperty); }
            Set { SetValue(OriginalStyleNameProperty, value); }
        }

        Public static DependencyProperty PropertyErrorsProperty =
            DependencyProperty.RegisterAttached("PropertyErrors", typeof(ReadOnlyCollection<String>), typeof(HighlightFormFieldOnErrors), New   r   opertyMetadata(BindableValidator.EmptyErrorsCollection, OnPropertyErrorsChanged));

        // The default For this Property only applies To TextBox controls. 
        Public static DependencyProperty HighlightStyleNameProperty =
            DependencyProperty.RegisterAttached("HighlightStyleName", typeof(String), typeof(HighlightFormFieldOnErrors), New   r op ert yMetadata("HighlightTextBoxStyle"));

        // The default For this Property only applies To TextBox controls. 
        protected static DependencyProperty OriginalStyleNameProperty =
            DependencyProperty.RegisterAttached("OriginalStyleName", typeof(Style), typeof(HighlightFormFieldOnErrors), New   r op ert yMetadata("BaseTextBoxStyle"));

        Private static void OnPropertyErrorsChanged(DependencyObject d, DependencyPropertyChangedEventArgs args)
        {
            If (args == Null || args.NewValue == Null)
            {
                return;
            }

            var control = ((Behavior<FrameworkElement>)d).AssociatedObject;
            var propertyErrors = (ReadOnlyCollection<String>)args.NewValue;

            Style style = (propertyErrors.Any()) ?
                (Style)Application.Current.Resources[((HighlightFormFieldOnErrors)d).HighlightStyleName] :
                (Style)Application.Current.Resources[((HighlightFormFieldOnErrors)d).OriginalStyleName];

            control.Style = style;
        }

        protected override void OnAttached()
        {
            base.OnAttached();
        }

        protected override void OnDetaching()
        {
            base.OnDetaching();
        }
    }
}


<Page
    x:Class="ams.TaskmanagerClient.Views.SettingsPage"
    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:helper="using:ams.TaskmanagerClient.Helpers"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Style="{StaticResource PageStyle}"
    xmlns:prismMvvm="using:Prism.Windows.Mvvm"
    xmlns:vm="using:ams.TaskmanagerClient.ViewModels"
    xmlns:controls="using:Microsoft.Toolkit.Uwp.UI.Controls"
    xmlns:i="using:Microsoft.Xaml.Interactivity"
    xmlns:ic="using:Microsoft.Xaml.Interactions.Core"
    xmlns:helpers="using:ams.TaskmanagerClient.Helpers"
    xmlns:behaviors="using:ams.TaskmanagerClient.Behaviors"      
    prismMvvm:ViewModelLocator.AutoWireViewModel="True" 
    xmlns:xaml="using:Windows.UI.Xaml"
    mc:Ignorable="d">
    <Page.Resources>
        <helper:EnumToBooleanConverter x:Key="EnumToBooleanConverter" EnumType="ElementTheme" />
    </Page.Resources>

    <Grid>
      <PasswordBox x:Name="ClientSecretPasswordBox" 
                   x:Uid="ClientSecretPasswordBox" 
                   AutomationProperties.AutomationId="ClientSecretPasswordBox" 
                   AutomationProperties.IsRequiredForForm="True" 
                   Password="{Binding NewClient.ClientSecret, Mode=TwoWay}"
                   IsTabStop="True">
          <i:Interaction.Behaviors>
              <behaviors:HighlightFormFieldOnErrors OriginalStyleName="BasePasswordBoxStyle"
                                                    HighlightStyleName="HighlightPasswordBoxStyle"
                                                    PropertyErrors="{Binding NewClient.Errors[ClientSecret], Mode=OneWay}" />
          </i:Interaction.Behaviors>
      </PasswordBox>
    </Grid>
</Page>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...