Примитивные типы данных требуются, потому что они - основание каждого сложного набора.
длинный, дважды, байт и т.д. используется при необходимости в только маленьком целом числе (или безотносительно), который не тратит впустую пространство "кучи".
я знаю, существует достаточно RAM в наши времена, но Вы не должны тратить впустую ее.
мне нужны "маленькие" для базы данных и операций с потоками.
Это почти идентично тому, как Карл Шиффлет продемонстрировал 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
Я только что создал небольшой пример , показывающий, как реализовывать команды в условности над стилем конфигурации. Однако он требует, чтобы функция 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.