这是我想在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
及以下是至少存在以下问题的实施尝试:
如何正确实施?
干杯,
Berryl
<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)
答案 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>
我们在这里说:
AvatarPath
AvatarPath
为空,请将来源设为'Img_Male'AvatarPath
为空且Gender
为女性,请将来源设为'Img_Female'答案 1 :(得分:1)
作为选项,您可以使用自定义转换器类并将viewmodel转换为位图源。 如果您希望使用触发器,那么您可以使用一些多数据触发器和/或多路转换器,例如,当您想要显示Img_Male时。
但是我认为这些解决方案并不是很好,最好引入属性/逻辑并简单地将图像源绑定到它并在viewmodel中处理这些视图逻辑。使用这种方法,您也可以为此逻辑编写单元测试。