wpf DataTrigger用法

5lwkijsr  于 2023-08-07  发布在  其他
关注(0)|答案(2)|浏览(102)

下面是我想在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是空的,我们关心性别?
1.有没有一种方法来做ELSE,所以我可以指定性别。男性资源只有一次,而不是一次,每个为
我如何正确地实现这一点?
干杯
贝里尔
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="Source" Value="{resx:Resx Img_Female}"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding Gender}" Value="{x:Static vm:Gender.Male}">
            <Setter Property="Source" Value="{resx:Resx Img_Male}"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding Gender}" Value="{x:Static vm:Gender.Unknown}">
            <Setter Property="Source" Value="{resx:Resx Img_Male}"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding Gender}" Value="{x:Static vm:Gender.Unspecified}">
            <Setter Property="Source" Value="{resx:Resx Img_Male}"/>
        </DataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>

更新:正如trimeyko所指出的,这 * 可以 * 通过多转换器或视图模型内部完成。

回复我的回复:“我实际上一开始就尝试了多转换器的方法,取得了一定的成功,几乎是为了帮助清理它。然后我决定转换器最好还是留给实际转换类型。同意视图模型方法可能是最简单的,但这似乎更像是视图的工作,我想看看我是否可以让它首先这样工作。
我做了我的尝试[解决这个问题与一个多传送张贴在这里](https://stackoverflow.com/questions/10638201/multiconverter-usage

bnlyeluc

bnlyeluc1#

您应该可以使用几个MultiDataTrigger来实现这一点:

<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 s是按照它们在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
1.如果AvatarPath为空,则将源设置为“Img_Male”
1.如果AvatarPath为空且Gender为女性,则将源设置为“Img_Female”

bq3bfh9z

bq3bfh9z2#

作为一个选项,您可以使用自定义转换器类和转换视图模型位图源。如果你想使用触发器,那么你可以使用一些multidatriggers和/或multiconverter,例如当你想显示Img_Male时。
但我认为这些解决方案并不好,最好引入属性/逻辑,并简单地将图像源绑定到它,并在视图模型中处理这些视图逻辑。使用这种方法,您还可以为该逻辑编写单元测试。

相关问题