首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在枚举上使用数据触发器更改图像

在枚举上使用数据触发器更改图像
EN

Stack Overflow用户
提问于 2012-12-17 23:28:43
回答 3查看 62.4K关注 0票数 111

我有一个带有固定背景图像的按钮,并想在它上面显示一个小的覆盖图像。选择哪个覆盖图像取决于相应视图模型的依赖属性(LapCounterPingStatus)。

这就是我到目前为止得到的:

代码语言:javascript
复制
<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>

视图模型的相关部分

代码语言:javascript
复制
public class ConfigurationViewModel
{
    public enum PingStatus { PING_UNKNOWN, PING_SUCCESS, PING_FAILURE };

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

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

更新

我的集成开发环境的跟踪窗口显示System.ArgumentExceptionSystem.FormatException。问题的根源可能是XAML中未知类型的枚举PingStatus吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-17 23:48:40

你需要两件事才能让它正常工作:

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

代码语言:javascript
复制
<UserControl ...
xmlns:my="clr-namespace:YourEnumNamespace;assembly=YourAssembly"> 

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

代码语言:javascript
复制
 <DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="{x:Static my:PingStatus.PING_UNKNOWN}">

请注意,Enum类型必须以上面定义的xmlns前缀作为前缀。

编辑:

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

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

例如:

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

票数 270
EN

Stack Overflow用户

发布于 2019-09-23 21:27:54

完整的WPF + MVVM工作示例。

在MSVC 2017上测试。

在视图中:

代码语言:javascript
复制
<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文件头中的名称空间进行以下更新(这很好):

代码语言:javascript
复制
xmlns:my="clr-namespace:Class.Path.MyViewModel;assembly=MyAssembly"

和VieModel:

代码语言:javascript
复制
public enum StatusIcon
{
    Debug,
    Info,
    Warning,
    Error
}

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

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

票数 4
EN

Stack Overflow用户

发布于 2020-10-29 05:47:53

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

代码语言:javascript
复制
<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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13917033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档