枚举数据触发更改图像


100

我有一个带有固定背景图像的按钮,并想在其顶部显示一个小的覆盖图像。选择哪个覆盖图像取决于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。问题源可能是PingStatusXAML中未知的枚举类型吗?


相关:stackoverflow.com/q/10250925/590790虽然这个家伙已经工作了。
史蒂文·杰里斯

Answers:


247

您需要2件事才能使此工作正常进行:

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

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

2-在的Value属性中DataTrigger,使用以下{x:Static}格式:

 <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}


1
我添加了xmlns这样的代码:xmlns:local="clr-namespace:MyCompany.Testbench"和类似的触发器<DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="{x:Static local:PingStatus.PING_UNKNOWN}">。不,我得到了错误Cannot find the type 'PingStatus'
nabulke 2012年

1
enum PingStatus在类中定义MyCompany.TestBench.ConfigurationViewModel。我必须在某个地方添加类名吗?
nabulke 2012年

3
谢谢。我在任何地方都找不到嵌套类型的语法。“ +”语法在哪里记录?我在MSDN或WPF书籍中找不到它。我认为应该在x:Static Markup Extension中,但事实并非如此。
skst

1
@skst +符号将包含类型与嵌套名称空间区分开。Type t = typeof (System.Environment.SpecialFolder); Console.WriteLine (t.FullName); // prints System.Environment+SpecialFolder


2

WPF + MVVM的完整工作示例。

在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"

和VieModel:

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

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

我们还使用Fody自动绑定。


您是指Fody的PropertyChanged项目吗?
6
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.