1. ホーム
  2. c#

[解決済み] enumでdatatriggerを使用して画像を変更する

2022-10-07 04:18:04

質問

背景画像が固定されたボタンがあり、その上に小さなオーバーレイ画像を表示したいと思っています。どのオーバーレイ画像を選択するかは、依存プロパティ ( 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にあるのでしょうか?

どのように解決するには?

動作させるためには、2つのことが必要です。

1 - 追加の xmlns への参照を追加します。

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