【问题标题】:Is there anyway of consolidating similar data bindings and/or triggers in XAML?无论如何在 XAML 中整合类似的数据绑定和/或触发器?
【发布时间】:2010-10-08 05:45:21
【问题描述】:

我有一个承载其他控件的用户控件。我实现这一点的方式是通过定义应该与特定视图模型关联的控件的数据模板。这些视图模型具有相似的属性和交互触发器。请参阅下面的 XAML sn-p。

这种方法的问题是,如果我想支持新的视图模型,我必须复制粘贴数据绑定。有没有办法将所有类似的数据绑定和/或触发器合并到一个模板中?我不想将相同的数据绑定定义键入/复制粘贴到每个控件中。 (是的,我知道,我就是这么懒。)

<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>

【问题讨论】:

标签: c# wpf xaml mvvm


【解决方案1】:

您可以使用通用样式,并将您的属性和触发器(也是属性)都放在这个样式中,看看这个StackOverflow question 了解更多详情。

【讨论】:

  • 我认为你是对的。虽然我还不知道具体怎么做,但至少我现在知道大方向了。谢谢。
【解决方案2】:

如何将触发器放入资源并将它们与您的控件相关联。或者为您的 DataTemplates 使用自定义基类。

【讨论】:

  • 我并不是真正的 XAML 专家。您有任何代码 sn-p 可用于说明这一点吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-02
相关资源
最近更新 更多