Этот вопрос связан скорее с опрятным программированием по линиям MVVM, а не с "how-do-I-get-this-to-work". Для ясности я хотел сохранить все ControlTemplates
для своих DataTemplates
в отдельном файле ResourceDictionary
. Итак, в главном окне это выглядит так:
<DataTemplate DataType="{x:Type localm:MusicSystem}">
<Control Template="{StaticResource MusicSystemTemplate}"/>
</DataTemplate>
Тем не менее, ControlTemplate для этого самого класса содержит ListBox
который должен реагировать на определенные события - есть некоторые обработчики, как здесь:
<ControlTemplate x:Key="MusicSystemTemplate">
<StackPanel ... >
<ListBox x:Name="SystemListBox" ...
PreviewMouseMove="SystemListBox_PreviewMouseMove"
PreviewMouseDown="SystemListBox_PreviewMouseDown"
MouseEnter="SystemListBox_MouseEnter"
MouseLeave="SystemListBox_MouseLeave">
<!-- More ListBox stuff here -->
</ListBox>
<!-- More other stuff here -->
</StackPanel>
</ControlTemplate>
На данный момент я сохраняю этот шаблон в XAML главного окна, а обработчики в его коде позади, но это не то, что я хочу. Если бы это была кнопка, я бы создал команду и связал ее так или иначе. Но поскольку это ListBox, я, к сожалению, лишен этой возможности. Я не хотел бы прибегать к коду, стоящему за ResourceDictionary, потому что это не то, для чего они предназначены. Есть ли аккуратный и не слишком многословный способ? Или, может быть, что-то не так с объявлением обработчиков внутри шаблона?
Для этого вы можете использовать прикрепленное поведение. Они могут быть либо поведением, установленным с помощью сборки Blend Interactivity, либо просто прикрепленными свойствами, которые добавляют и удаляют обработчики событий при изменении их значений.
Обзор: поведение в WPF.
View
, если вы хотите использоватьTemplates
в нескольких представлениях, вам придется использовать вместо этого метод привязки, напримерAttachedProperty
,Behaviours
т. Д.