Реализация ICommand MVVM

Примитивные типы данных требуются, потому что они - основание каждого сложного набора.

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

я знаю, существует достаточно RAM в наши времена, но Вы не должны тратить впустую ее.

мне нужны "маленькие" для базы данных и операций с потоками.

57
задан Uwe Keim 8 February 2019 в 06:18
поделиться

2 ответа

Это почти идентично тому, как Карл Шиффлет продемонстрировал a RelayCommand , где Execute запускает заранее определенное Action . Первоклассное решение, если вы спросите меня.

public class RelayCommand : ICommand
{
    private Predicate<object> _canExecute;
    private Action<object> _execute;

    public RelayCommand(Predicate<object> canExecute, Action<object> execute)
    {
        this._canExecute = canExecute;
        this._execute = execute;
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public bool CanExecute(object parameter)
    {
        return _canExecute(parameter);
    }

    public void Execute(object parameter)
    {
        _execute(parameter);
    }
}

Затем это можно было бы использовать как ...

public class MyViewModel
{
    private ICommand _doSomething;
    public ICommand DoSomethingCommand
    {
        get
        {
            if (_doSomething == null)
            {
                _doSomething = new RelayCommand(
                    p => this.CanDoSomething,
                    p => this.DoSomeImportantMethod());
            }
            return _doSomething;
        }
    }
}

Подробнее:
Джош Смит (представитель RelayCommand ): Шаблоны - приложения WPF С шаблоном проектирования MVVM

69
ответ дан 7 November 2019 в 06:06
поделиться

Я только что создал небольшой пример , показывающий, как реализовывать команды в условности над стилем конфигурации. Однако он требует, чтобы функция Reflection.Emit() была доступна. Поддерживающий код может показаться немного странным, но после его написания его можно использовать много раз.

Teaser:

public class SampleViewModel: BaseViewModelStub
{
    public string Name { get; set; }

    [UiCommand]
    public void HelloWorld()
    {
        MessageBox.Show("Hello World!");
    }

    [UiCommand]
    public void Print()
    {
        MessageBox.Show(String.Concat("Hello, ", Name, "!"), "SampleViewModel");
    }

    public bool CanPrint()
    {
        return !String.IsNullOrEmpty(Name);
    }
}

}

UPDATE: теперь, похоже, существуют некоторые библиотеки типа http://www.codeproject.com/Articles/101881/Executing-Command-Logic-in-a-View-Model, которые решают проблему с кодом шаблона ICommand.

10
ответ дан 7 November 2019 в 06:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: