下面是我想在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)
2条答案
按热度按时间bnlyeluc1#
您应该可以使用几个
MultiDataTrigger
来实现这一点:字符串
这些是“当
AvatarPath
为空且Gender
为女性时...”进一步改善
由于
DataTrigger
s是按照它们在XAML中出现的顺序应用的,因此我们可以在下面的示例中删除重复“男性”设置的需要:型
我们在这里说:
1.将源设置为
AvatarPath
1.如果
AvatarPath
为空,则将源设置为“Img_Male”1.如果
AvatarPath
为空且Gender
为女性,则将源设置为“Img_Female”bq3bfh9z2#
作为一个选项,您可以使用自定义转换器类和转换视图模型位图源。如果你想使用触发器,那么你可以使用一些multidatriggers和/或multiconverter,例如当你想显示Img_Male时。
但我认为这些解决方案并不好,最好引入属性/逻辑,并简单地将图像源绑定到它,并在视图模型中处理这些视图逻辑。使用这种方法,您还可以为该逻辑编写单元测试。