枚举上的数据触发器更改图像

我有一个按钮与固定的背景图像,并希望显示一个小覆盖图像的顶部。要选择哪个覆盖图像取决于相应视图模型的依赖属性(LapCounterPingStatus)。

这是我目前得到的信息:

<Button>
<Grid>
<Image Stretch="None"> <!-- Background Image -->
<Image.Style>
<Style TargetType="{x:Type Image}">
<Setter Property="Source" Value="/Images/Pingn.png"/>
</Style>
</Image.Style>
</Image>
<Image Stretch="None" Panel.ZIndex="1"> <!-- Small Overlay Image -->
<Image.Style>
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="PingStatus.PING_UNKNOWN">
<Setter Property="Source" Value="/Images/RefreshOverlayn.png"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="PingStatus.PING_FAILURE">
<Setter Property="Source" Value="/Images/ErrorOverlayn.png"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="PingStatus.PING_SUCCESS">
<Setter Property="Source" Value="/Images/CheckmarkOverlayn.png"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
</Grid>
</Button>

视图模型的相关部分

public class ConfigurationViewModel
{
public enum PingStatus { PING_UNKNOWN, PING_SUCCESS, PING_FAILURE };


public PingStatus LapCounterPingStatus
{
get { return _lapCounterPingStatus; }
set
{
_lapCounterPingStatus = value;
RaisePropertyChanged(LapCounterPingStatusPropertyName);
}
}
}

现在,根本没有显示覆盖图像。会出什么问题呢?


更新

我的 IDE 的跟踪窗口正在显示 System.ArgumentExceptionSystem.FormatException。 问题源是否可能是 XAML 中未知类型的枚举 PingStatus

67835 次浏览

你需要两样东西才能让它工作:

1-在 XAML 文件的根元素中添加一个 xmlns引用到定义 Enum 的命名空间:

<UserControl ...
xmlns:my="clr-namespace:YourEnumNamespace;assembly=YourAssembly">

2-在 DataTriggerValue属性中,使用 {x:Static}表格:

 <DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="{x:Static my:PingStatus.PING_UNKNOWN}">

注意,Enum 类型的前缀必须是上面定义的 xmlns 前缀。

编辑:

如果您的 Enum 是在一个类中声明的,那么您需要使用以下语法:

{x:Static namespace:ClassName+EnumName.EnumValue}

for example:

{x:Static my:ConfigurationViewModel+PingStatus.PING_UNKNOWN}

完整的 WPF + MVVM 工作示例。

Tested on MSVC 2017.

观点:

<TextBlock Text="Some text to be colored by an enum">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding StatusIcon}" Value="{x:Static my:StatusIcon.Warning}">
<Setter Property="Foreground" Value="Yellow"/>
</DataTrigger>
<DataTrigger Binding="{Binding StatusIcon}" Value="{x:Static my:StatusIcon.Error}">
<Setter Property="Foreground" Value="Red}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>

如果使用 ReSharper,并且 DataContext 设置正确,那么当您在 StatusIcon之后点击 .时会有智能感知,也就是说,它将显示枚举的属性,即 DebugInfoWarningError

如果使用 ReSharper,它将建议对 XAML 文件头中的名称空间进行以下更新(其 很好) :

xmlns:my="clr-namespace:Class.Path.MyViewModel;assembly=MyAssembly"

还有视频模型:

public enum StatusIcon
{
Debug,
Info,
Warning,
Error
}


public class MyViewModel
{
public StatusIcon StatusIcon { get; }
}

我们还使用 Fody进行自动绑定。

您可以简单地将枚举值设置为 DataTrigger Value... ... 在 MSVC 2017上测试。

<TextBlock Text="Some text to be colored by an enum">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding StatusIcon}" Value="Warning">
<Setter Property="Foreground" Value="Yellow"/>
</DataTrigger>
<DataTrigger Binding="{Binding StatusIcon}" Value="Error">
<Setter Property="Foreground" Value="Red}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>