WPF 无需Converter根据状态值加载图片并复用资源模板实现咨询
方案1:复用Style实现(更轻量,推荐)
你不需要额外封装DataTemplate,直接把触发逻辑抽为全局Style即可,调整你的资源代码如下:
<Window.Resources> <Style x:Key="DeskStatusImageStyle" TargetType="Image"> <!-- 配置默认加载的图片,避免状态未更新时空白 --> <Setter Property="Source" Value="pack:///application:,,,/Resources/DeskUnknown.png"/> <Style.Triggers> <DataTrigger Binding="{Binding}" Value="0"> <Setter Property="Source" Value="pack:///application:,,,/Resources/DeskAvailable.png"/> </DataTrigger> <DataTrigger Binding="{Binding}" Value="1"> <Setter Property="Source" Value="pack:///application:,,,/Resources/DeskUnavailable.png"/> </DataTrigger> <DataTrigger Binding="{Binding}" Value="2"> <Setter Property="Source" Value="pack:///application:,,,/Resources/DeskUnknown.png"/> </DataTrigger> </Style.Triggers> </Style> </Window.Resources>
调用时只需要给Image指定Style,同时把Image的DataContext绑定到对应工位的Status属性即可,示例:
<!-- 第一个工位 --> <Image x:Name="Desk1" Grid.Column="1" Grid.Row="2" Width="50" Height="50" Style="{StaticResource DeskStatusImageStyle}" DataContext="{Binding Office[0].Desks[0].Status}"/> <!-- 第二个工位,只需要修改绑定路径即可 --> <Image x:Name="Desk2" Grid.Column="2" Grid.Row="2" Width="50" Height="50" Style="{StaticResource DeskStatusImageStyle}" DataContext="{Binding Office[0].Desks[1].Status}"/>
方案2:保留你原有DataTemplate的实现
如果你希望用DataTemplate的写法,只需要补全DataTrigger的Binding属性,然后用ContentControl调用模板即可。
先调整资源代码:
<Window.Resources> <DataTemplate x:Key="DeskImage"> <Image> <Image.Style> <Style TargetType="Image"> <Setter Property="Source" Value="pack:///application:,,,/Resources/DeskUnknown.png"/> <Style.Triggers> <DataTrigger Binding="{Binding}" Value="0"> <Setter Property="Source" Value="pack:///application:,,,/Resources/DeskAvailable.png"/> </DataTrigger> <DataTrigger Binding="{Binding}" Value="1"> <Setter Property="Source" Value="pack:///application:,,,/Resources/DeskUnavailable.png"/> </DataTrigger> <DataTrigger Binding="{Binding}" Value="2"> <Setter Property="Source" Value="pack:///application:,,,/Resources/DeskUnknown.png"/> </DataTrigger> </Style.Triggers> </Style> </Image.Style> </Image> </DataTemplate> </Window.Resources>
调用示例:
<ContentControl x:Name="Desk1" Grid.Column="1" Grid.Row="2" Width="50" Height="50" Content="{Binding Office[0].Desks[0].Status}" ContentTemplate="{StaticResource DeskImage}"/>
内容的提问来源于stack exchange,提问作者user3001499
相关产品推荐
相关产品推荐

