112

背景画像が固定されたボタンがあり、その上に小さなオーバーレイ画像を表示したいと思います。どのオーバーレイ画像を選択するかは、対応するビューモデルの依存関係プロパティ(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.ArgumentExceptionされていSystem.FormatExceptionます。問題の原因はPingStatus、XAMLでの不明なタイプの列挙である可能性がありますか?

4

3 に答える 3

271

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

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

于 2012-12-17T15:48:40.357 に答える