Есть ли способ объединить похожие привязки данных и / или триггеры в XAML? - PullRequest
7 голосов
/ 08 октября 2010

У меня есть пользовательский элемент управления, который содержит другие элементы управления.Я реализовал это с помощью шаблонов данных, которые определяют элемент управления, который должен быть связан с конкретной моделью представления.Эти модели представления имеют схожие свойства и триггеры взаимодействия.См. Фрагмент кода XAML ниже.

Проблема этого подхода заключается в том, что мне придется копировать и вставлять привязки данных, если я хочу поддерживать новую модель представления.Есть ли способ объединить все похожие привязки данных и / или триггеры в один шаблон?Я не хочу вводить / копировать и вставлять одни и те же определения привязки данных в каждый элемент управления.(Да, я знаю, я такой ленивый.)

<UserControl.Resources>   
    <DataTemplate DataType="{x:Type vm:SomeViewModel1}">
        <TextBlock Canvas.Left="{Binding Left}"
                   Canvas.Top="{Binding Top}"
                   RenderTransform="{Binding Transform}"
                   Height="{Binding Height}"
                   Width="{Binding Width}">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseEnter">
                    <cmd:EventToCommand Command="{Binding MouseEnterCommand}"/>
                </i:EventTrigger>
                <i:EventTrigger EventName="MouseLeave">
                    <cmd:EventToCommand Command="{Binding MouseLeaveCommand}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </TextBlock>
    </DataTemplate>

    <DataTemplate DataType="{x:Type vm:SomeViewModel2}">
        <Rectangle Canvas.Left="{Binding Left}"
                   Canvas.Top="{Binding Top}"
                   RenderTransform="{Binding Transform}"
                   Height="{Binding Height}"
                   Width="{Binding Width}">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseEnter">
                    <cmd:EventToCommand Command="{Binding MouseEnterCommand}"/>
                </i:EventTrigger>
                <i:EventTrigger EventName="MouseLeave">
                    <cmd:EventToCommand Command="{Binding MouseLeaveCommand}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Rectangle>
    </DataTemplate>

    <DataTemplate DataType="{x:Type vm:SomeViewModel3}">
        <Button Canvas.Left="{Binding Left}"
                Canvas.Top="{Binding Top}"
                RenderTransform="{Binding Transform}"
                Height="{Binding Height}"
                Width="{Binding Width}">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseEnter">
                    <cmd:EventToCommand Command="{Binding MouseEnterCommand}"/>
                </i:EventTrigger>
                <i:EventTrigger EventName="MouseLeave">
                    <cmd:EventToCommand Command="{Binding MouseLeaveCommand}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Button>
    </DataTemplate>

    <DataTemplate DataType="{x:Type vm:SomeViewModel4}">
       <!-- Do not want copy-paste code here... -->
    </DataTemplate>
</UserControl.Resources>

Ответы [ 2 ]

1 голос
/ 11 октября 2010

Вы можете использовать общий стиль и поместить свои свойства и триггеры (которые также являются свойствами) в этот стиль. Для получения более подробной информации смотрите этот вопрос StackOverflow .

0 голосов
/ 08 октября 2010

Как насчет размещения триггеров в ресурсе и связывания их с вашими элементами управления.Или используйте пользовательский базовый класс для ваших шаблонов данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...