[c#] 이미지 변경을위한 열거 형 데이터 트리거

배경 이미지가 고정 된 버튼이 있는데 그 위에 작은 오버레이 이미지를 표시하고 싶습니다. 선택할 오버레이 이미지 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. 문제의 원인이 PingStatusXAML 에서 알 수없는 열거 유형일 수 있습니까?



답변

이 작업을 수행하려면 두 가지가 필요합니다.

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}


답변

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가 있습니다 열거의 특성이 표시됩니다, 즉 Debug, Info, Warning또는 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자동 바인딩 에도 사용 합니다.


답변