1

这是我想在 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 用法

4

2 回答 2

4

你应该可以用几个 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为 null,则将源设置为“Img_Male”
  3. 如果AvatarPath为空且Gender为女性,则将源设置为“Img_Female”
于 2012-05-17T15:06:25.520 回答
1

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

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

于 2012-05-17T13:05:05.237 回答