【问题标题】:DataTrigger Usage数据触发器使用
【发布时间】:2012-05-25 01:11:59
【问题描述】:

这是我想在 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 为空并且我们关心 Gender?
  2. 有没有办法做 ELSE,所以我可以只指定一次 Gender.Male 资源,而不是每个

我怎样才能正确地实现它?

干杯,
浆果

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)

【问题讨论】:

    标签: wpf xaml data-binding datatrigger


    【解决方案1】:

    你应该可以通过几个MultiDataTriggers 来做到这一点:

    <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 为女性时......'

    进一步改进

    由于DataTriggers 是按照它们在 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”

    【讨论】:

    • 是的,这就是我认为应该解决的问题。我遇到了一个问题,我是separate question here。你能看看那个吗?
    • 我想没有办法重复每个性别值的条件,即使它总是 Img_Male,除非它实际上是女性,是吗?干杯
    【解决方案2】:

    作为一个选项,您可以使用自定义转换器类并将视图模型转换为位图源。 如果您想使用触发器,那么您可以使用一些多数据触发器和/或多转换器,例如当您想要显示 Img_Male 的情况。

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

    【讨论】:

    • 我实际上首先尝试了多转换器方法,并取得了一定的成功,并且几乎将其发布以帮助清理它。然后我决定转换器最好留给实际转换类型。同意视图模型方法可能是最简单的,但这似乎更像是视图的工作,我想看看我是否可以首先让它工作。干杯
    • 单元测试图像也是有问题的,因为没有提供图像相等性(可以理解)。干杯
    • 在一些图像之间进行选择并显示正确的图像仍然是应用程序逻辑,创建视图模型以在其中累积所有视图逻辑/属性,您可以轻松编写新视图而无需复制粘贴一些 xaml 触发器等. 您仍然可以在不同的逻辑情况下对位图的路径属性进行单元测试。为什么你这么害怕在 VM 中编写这些逻辑?顺便说一句,关于转换器的句子不太清楚,但是多转换器只是根据多值输入输出一个值,而不是转换类型。
    • 请参阅this question,您可能对此有一些答案,也适用于 vm 类型的解决方案。干杯
    • 我没有足够的代表来评论你的第二个问题,所以我会写在这里:multivalueconverters 输入和输出值必须都是相同的类型,这就是你收到 UnsetValue 的原因示例
    猜你喜欢
    • 2010-11-14
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 2018-08-06
    • 2012-02-23
    • 1970-01-01
    相关资源
    最近更新 更多