Как реализовать проверку свойств и команд только один раз?C#

Место общения программистов C#
Ответить
Anonymous
 Как реализовать проверку свойств и команд только один раз?

Сообщение Anonymous »

В WPF я думаю, как реализовать проверку только один раз и использовать ее для команд и модели представления, чтобы можно было предупредить пользователя о проблеме.
Для меня , возможно, я ошибаюсь, но когда модель представления проверяет свойство, оно проверяется в соответствии с командой, которую я хочу выполнить.
Для этого именно команда определяет логику проверки, та же логика, которую модель представления должна будет использовать для проверки свойства.
Поэтому я хотел бы иметь класс для проверки данных, возможно, с использованием правила проверки, что он будет использоваться в методе CanExecute команды и будет использоваться моделью представления для проверки свойства.
Я хотел бы использовать класс для команды, потому что я Думаю, что логика команды не должна быть в модели представления, модель представления должна только предоставлять данные, необходимые представлению, и, возможно, адаптировать данные из команды к формату, который лучше подходит для представления.
И модель представления, которая использует класс проверки для проверки свойства и использует команду для выполнения действия.
В соответствии с этим предположим, что у меня есть представление модель со свойством электронной почты и командой SaveEmail. Для упрощения это очень просто: просто проверьте, есть ли в строке хотя бы один "@".

Код: Выделить всё

    public class EmailValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
if(value.ToString().Contains("@"))
{
return ValidationResult.ValidResult;
}

return new ValidationResult(false, "Email format is invalid.");
}
}
}

Код: Выделить всё

    public interface ISaveEmailCommand()
{
public Task Execute();

public void CanExecute();
}

Код: Выделить всё

    public class SaveEmailCommand : ISaveEmailCommand
{
public async Task Execute(string Email)
{
//code to save email in the database
}

public bool CanExecute(string Email)
{
//Use in some way EmailValidationRule, or the class to validate
}
}

Код: Выделить всё

    //To simplify code, I use CommunityToolkit.MVVM
public partial class EmailViewModel : ObservableCollection
{
ISaveEmailCommand _saveEmailCommand;

//The command is injected in the view model.
public EmailViewModel(ISaveEmailCommand paramSaveEmailCommand)
{
_saveEmailCommand = paramSaveEmailCommand;
}

[ObservableProperty]
public string _email;

[RelayCommand]
[RelayCommand(CanExecute = nameof(SaveEmailCanExecute))]
public async Task SaveEmail()
{
_saveEmailCommand.Execute(Email);
}

private bool SaveEmailcanExecute()
{
return _saveEmailCommand.CanExecute(Email);
}
}
Но я вижу в этом решении некоторые недостатки. Хотя это не связано напрямую с проверкой свойства, а больше о том, когда включать или отключать команду.
Одной из причин отключения команды является то, что свойство (данные, которые она потребности) неверно. Но другой причиной могут быть внешние причины.
Например, возможно, существуют некоторые условия, которые могут привести к отключению команды, и это не является ответственностью команды. Предположим, что в пользовательском интерфейсе есть флажок, который пользователь может установить или отключить, чтобы отключить действие. Я думаю, что команда не должна знать об этом, это скорее проблема модели представления, чтобы отключить команду. В этом случае у меня была бы логика включения или отключения команды в двух местах: в правиле проверки, а также в модели представления, чтобы узнать, установлен флажок или нет.
Подводя итог, я хотел бы знать, как я могу разместить команду в отдельном классе, модель представления и способ реализации логики для проверки свойства, а также способ включения или отключения команды, поскольку данные неверны или из-за внешних условий (пользователь отключил команду).
Спасибо.

Подробнее здесь: https://stackoverflow.com/questions/786 ... d-commands
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»