DataTrigger用法

时间:2012-05-17 12:50:10

标签: wpf xaml data-binding datatrigger

这是我想在xaml中实现的伪代码

IF vm.AvatarFilePath IS NOT NULL THEN
    Image.Source = {Binding AvatarPath}
ELSE
    If vm.Gender == {x:Static vm:Gender.Female} THEN
        Image.Source = {StaticResource Img_Female}
    ELSE
        Image.Source = {StaticResource Img_Male}
    ENDIF
ENDIF

及以下是至少存在以下问题的实施尝试:

  1. 它如何知道AvatarPath为空并且我们关心性别?
  2. 有没有办法做ELSE,所以我只能指定一次Gender.Male资源,而不是每次都指定一次
  3. 如何正确实施?

    干杯,
    Berryl

    xaml尝试1

    <DataTemplate x:Key="AvatarPathTemplate">
        <Image x:Name="avatarImage" Source="{Binding AvatarPath}"/>
        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding Gender}" Value="{x:Static vm:Gender.Female}">
                <Setter Property="Sourrce" Value="{resx:Resx Img_Female}"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding Gender}" Value="{x:Static vm:Gender.Male}">
                <Setter Property="Sourrce" Value="{resx:Resx Img_Male}"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding Gender}" Value="{x:Static vm:Gender.Unknown}">
                <Setter Property="Sourrce" Value="{resx:Resx Img_Male}"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding Gender}" Value="{x:Static vm:Gender.Unspecified}">
                <Setter Property="Sourrce" Value="{resx:Resx Img_Male}"/>
            </DataTrigger>
        </DataTemplate.Triggers>
    </DataTemplate>
    

    更新

    正如trimeyko指出的那样,这个可以使用多转换器或在视图模型中完成。

    根据我的回答:“我实际上一开始尝试了多转换器方法,取得了一定的成功,并且几乎发布了这个方法以帮助清理它。然后我决定转换器最好留给实际转换类型。同意视图模型方法这可能是最简单的,但这似乎更多的是视图的工作,我想看看我是否可以让它首先工作。“

    我尝试[在这里发布mutliConveter解决此问题](MultiConverter usage

2 个答案:

答案 0 :(得分:4)

您应该可以使用几个MultiDataTrigger s来执行此操作:

<DataTemplate x:Key="AvatarPathTemplate">
    <Image x:Name="avatarImage" Source="{Binding AvatarPath}"/>
    <DataTemplate.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding AvatarPath}" Value="{x:Null}" />
                <Condition Binding="{Binding Gender}" Value="{x:Static vm:Gender.Female}"/>
            </MultiDataTrigger.Conditions>
            <Setter Property="Source" Value="{resx:Resx Img_Female}"/>
        </MultiDataTrigger>

        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding AvatarPath}" Value="{x:Null}" />
                <Condition Binding="{Binding Gender}" Value="{x:Static vm:Gender.Male}"/>
            </MultiDataTrigger.Conditions>
            <Setter Property="Source" Value="{resx:Resx Img_Male}"/>
        </MultiDataTrigger>
        <!-- etc... -->
    </DataTemplate.Triggers>
</DataTemplate>

这些是“当AvatarPath为空且Gender为女性时......”

进一步改善

由于DataTrigger按照它们在XAML中出现的顺序应用,我们可以通过以下方式删除示例中“男性”设置重复的需要:

<DataTemplate x:Key="AvatarPathTemplate">
    <Image x:Name="avatarImage" Source="{Binding AvatarPath}"/>
    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding AvatarPath}" Value="{x:Null}">
            <Setter Property="Source" Value="{resx:Resx Img_Male}"/>
        </DataTrigger>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding AvatarPath}" Value="{x:Null}" />
                <Condition Binding="{Binding Gender}" Value="{x:Static vm:Gender.Female}"/>
            </MultiDataTrigger.Conditions>
            <Setter Property="Source" Value="{resx:Resx Img_Female}"/>
        </MultiDataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>

我们在这里说:

  1. 将来源设为AvatarPath
  2. 如果AvatarPath为空,请将来源设为'Img_Male'
  3. 如果AvatarPath为空且Gender为女性,请将来源设为'Img_Female'

答案 1 :(得分:1)

作为选项,您可以使用自定义转换器类并将viewmodel转换为位图源。 如果您希望使用触发器,那么您可以使用一些多数据触发器和/或多路转换器,例如,当您想要显示Img_Male时。

但是我认为这些解决方案并不是很好,最好引入属性/逻辑并简单地将图像源绑定到它并在viewmodel中处理这些视图逻辑。使用这种方法,您也可以为此逻辑编写单元测试。