画像を変更する列挙型のデータトリガー


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ます。問題の原因PingStatusは、XAML で不明な種類の列挙型である可能性がありますか?


関連:stackoverflow.com/q/10250925/590790この男はすでに動作していますが。
Steven Jeuris

回答:


247

これを機能させるには2つのものが必要です。

1- xmlnsXAMLファイルのルート要素に、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

1
enum PingStatusクラス内で定義されMyCompany.TestBench.ConfigurationViewModelます。クラス名をどこかに追加する必要がありますか?
nabulke

3
ありがとうございました。入れ子になった型の構文はどこにも見つかりませんでした。「+」構文はどこに文書化されていますか?MSDNやWPFの本にはありません。私はそれがx:Static Markup Extensionにあるべきだと思っていましたが、そうではありません。
skst 2013年

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>

DataContextのが適切に設定されている場合、あなたが打ったときReSharperのを使用している場合、および、インテリセンスがあるでしょう.後にStatusIconそれがある列挙型のプロパティが表示されます、すなわちDebugInfoWarningまたはをError

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プロジェクトを参照していますか?
UuDdLrLrSs
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.