Что делать с EventHandlers в ControlTemplate, определенном в ResourceDictionary?

1

Этот вопрос связан скорее с опрятным программированием по линиям 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, потому что это не то, для чего они предназначены. Есть ли аккуратный и не слишком многословный способ? Или, может быть, что-то не так с объявлением обработчиков внутри шаблона?

  • 1
    События являются специфическими для View , если вы хотите использовать Templates в нескольких представлениях, вам придется использовать вместо этого метод привязки, например AttachedProperty , Behaviours т. Д.
Теги:
xaml
wpf
event-handling
mvvm

1 ответ

1

Для этого вы можете использовать прикрепленное поведение. Они могут быть либо поведением, установленным с помощью сборки Blend Interactivity, либо просто прикрепленными свойствами, которые добавляют и удаляют обработчики событий при изменении их значений.

Обзор: поведение в WPF.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню