WPF-код эквивалент - PullRequest
       7

WPF-код эквивалент

3 голосов
/ 14 октября 2011

При разработке мне нравится пытаться понять больше, чем «просто сделать это». Особенно с WPF мне нравится понимать ОБА аспекты привязки ... как из GUI (xaml), так и из кода. При этом мне интересно, каким будет эквивалентный код для следующего.

У меня есть ViewModel с некоторыми предопределенными экземплярами "ICommand", такими как добавление, редактирование, сохранение, отмена, выход и т. Д., И все они работают как положено. Теперь, глядя на привязку вида (окна), на котором есть кнопка, у меня есть привязка к командам, что-то вроде.

<Button Command="{Binding ExitCommand}" Content="Exit" ... />

и это правильно делает то, что я ожидаю, чтобы позволить форме выйти (и делать все остальное, с чем я играю).

Как бы выглядел кодовый код для этого. Я знаю, что со свойствами, такими как IsEnabled или IsVisible, связаны объект / свойства зависимости, но я не понимаю корреляции при привязке к выполнению команды. Спасибо.

1 Ответ

5 голосов
/ 15 октября 2011

Вы создаете привязку команд так же, как и любую другую привязку в коде.

Например,

Binding b = new Binding();
b.Source = myViewModel;
b.Path = new PropertyPath("ExitCommand");
MyButton.SetBinding(Button.CommandProperty, b);

Привязки команд ожидают привязки к объекту типа ICommand. Когда они выполняются, например, при нажатии кнопки, они сначала вызывают ICommand.CanExecute(), а если это правда, то они вызывают ICommand.Execute(). Если установлено свойство CommandParameter, то оно используется при оценке CanExecute и Execute

В случае кнопок WPF с привязкой команд свойство IsEnabled автоматически связывается с результатом ICommand.CanExecute. Метод CanExecute запускается один раз при первой загрузке кнопки и запускается снова каждый раз, когда изменяется привязка команды.

Если вы хотите, чтобы он обновлялся чаще, например, когда меняется CommandParameter, вам нужно подключить что-то дополнительное, чтобы обновить привязку при изменении CommandParameter. Большинство RelayCommands, как я вижу, имеют эту встроенную функцию, например MVVM Light RelayCommand, хотя другие команды, такие как Microsoft PRISM DelegateCommand, по умолчанию не имеют такого поведения.

...