이미지 변경을위한 열거 형 데이터 트리거


101

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


관련 : stackoverflow.com/q/10250925/590790 이 사람은 이미 작동했지만.
Steven Jeuris

답변:


249

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

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

1
@skst + 기호는 포함 된 유형과 중첩 된 네임 스페이스를 구분합니다. Type t = typeof (System.Environment.SpecialFolder); Console.WriteLine (t.FullName); // prints System.Environment+SpecialFolder


3

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자동 바인딩 에도 사용 합니다.


Fody의 PropertyChanged 프로젝트를 언급하고 있습니까?
UuDdLrLrSs
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.