下面是我想在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下面是至少有以下几个问题的实现尝试:
指定一次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所指出的,这可以通过多转换器或在视图模型内部完成。
我的回答是:“我一开始尝试了多转换器的方法,取得了一定的成功,我几乎发了一条帖子来帮助清理它。然后我决定,转换器最好留给真正的转换类型。我同意视图模型方法可能是最简单的,但这似乎更像是视图的工作,我想看看我是否能让它首先以这种方式工作。”
我尝试了一下solving this with a mutliConveter posting here
发布于 2012-05-17 15:06:25
您应该能够用几个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为null而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'发布于 2012-05-17 13:05:05
作为一个选项,您可以使用自定义转换器类并将视图模型转换为位图源。如果您希望使用触发器,那么您可以使用一些多数据工具和/或多个转换器--例如,在要显示Img_Male的情况下。
但是,我认为这些解决方案并不是很好,最好是引入属性/逻辑,简单地将图像源绑定到它,并在视图模型中处理这些视图逻辑。使用这种方法,您也可以为这个逻辑编写单元测试。
https://stackoverflow.com/questions/10636061
复制相似问题