Кроме того, к ответу выше, у Вас может быть таблица MySQL, которая использует механизм CSV.
Затем у Вас будет файл на Вашем жестком диске, который всегда будет в формате CSV, который Вы могли просто скопировать, не обрабатывая его.
A CommandBinding
похож на любой другой элемент в вашем визуальном дереве. Любые события, указанные в нем, будут обрабатываться корнем вашего визуального дерева (в данном случае ваше Окно
). Это означает, что если вы переместите AddPage_Executed
и AddPage_CanExecute
в код вашего окна, он будет работать. Это позволяет вам использовать одну и ту же команду во многих компонентах пользовательского интерфейса, но иметь разные обработчики.
Однако я вижу, что ваша команда выполняет некоторую логику в отношении вашей модели представления. Чтобы сэкономить время и нервы, поймите, что маршрутизированные команды - неправильное решение. Вместо этого инкапсулируйте свою команду в свою модель представления примерно так:
public class ProjectViewModel
{
private readonly ICollection<PageViewModel> _pages;
private readonly ICommand _addPageCommand;
public ProjectViewModel()
{
_pages = new ObservableCollection<PageViewModel>();
_addPageCommand = new DelegateCommand(AddPage);
}
public ICommand AddPageCommand
{
get { return _addPageCommand; }
}
private void AddPage(object state)
{
_pages.Add(new PageViewModel());
}
}
A DelegateCommand
- это реализация ICommand
, которая вызывает делегатов для выполнения и запроса команды. Это означает, что вся логика команды заключена в самой команде, и вам не нужна CommandBinding
для предоставления обработчиков (вам вообще не нужна CommandBinding
). Итак, ваше представление просто привязывается к вашей виртуальной машине следующим образом:
<MenuItem Header="_New" Command="{Binding AddPageCommand}"/>
Я предлагаю вам прочитать эту серию сообщений, чтобы дать вам больше контекста: