У меня была проблема с кнопками в controlTemplates & dataTemplates. Я нахожу, что триггеры часто слишком громоздки, чтобы предоставить именно то, что хотят мои клиенты, у меня оказалось слишком много конвертеров. Метод, который я впервые попробовал, состоял в том, чтобы определить эти более сложные шаблоны встроенными, чтобы они могли быть связаны с командами (и событиями codebehind) на моих экранах ViewModel.
если вы настраиваете свой собственный элемент управления, я должен упомянуть, что самый простой способ - просто назвать кнопку, а затем использовать что-то вроде этого:
hourHand = this.Template.FindName( "PART_HourHand", this ) as Rectangle;
Однако в последнее время я изменил такт (обратно на отдельные файлы .. RE-USE!), Но начал добавлять ViewModel (своего рода), который я суффикс ...TemplateCommandStore
, ко всем моим шаблонам, которые становятся немного сложнее. Я даже использую это при создании шаблонов своих пользовательских элементов управления (в основном, для согласованности)
public class BookingDetailsTemplateCommandStore
{
public OpenWindowCommand_Command OpenWindowCommand_Command { get; set; }
public BookingDetailsTemplateCommandStore()
{
OpenWindowCommand_Command = new OpenWindowCommand_Command( this );
}
}
Тогда я с радостью смогу использовать эту команду в шаблоне. Вы также можете передать управляющие ссылки в хранилище команд, привязав к нему свойство (зависимость?) Для захвата событий и более точного контроля над вашими шаблонами.
<DataTemplate DataType="{x:Type LeisureServices:BookingSummary}">
<Border Height="50" otherStyling="xyz">
<Border.Resources>
<local:BookingDetailsTemplateCommandStore x:Key="CommandStore" />
</Border.Resources>
<DockPanel>
<Button otherStyling="xyz"
Command="{Binding Source={StaticResource CommandStore},
Path=OpenWindowCommand_Command}" />
MVVM: Я считаю, что пока графическая логика только и полностью отличается от бизнес-логики, эта методология не мешает MVVM. По сути, я добавляю постоянную кодируемость C # к шаблонам, которую каждый, кто провел слишком много времени в winforms, может пропустить так же сильно, как и я.