छवि बदलने के लिए enum पर डेटाट्रिगर


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

अभी, किसी भी ओवरले छवि को प्रदर्शित नहीं किया गया है। क्या गलत हो सकता है?


अपडेट करें

मेरी आईडीई की ट्रेस खिड़की दिखाया जा रहा है System.ArgumentExceptionऔर System.FormatException। क्या समस्या का स्रोत एक अज्ञात प्रकार का गणन PingStatusXAML हो सकता है?


संबंधित: stackoverflow.com/q/10250925/590790 हालांकि इस आदमी को यह पहले से ही काम मिल गया।
स्टीवन ज्यूरिस

जवाबों:


247

इस काम को करने के लिए आपको 2 चीजों की आवश्यकता है:

1 - xmlnsअपनी 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}


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'
नबंलके

1
enum PingStatusवर्ग के अंदर परिभाषित किया गया है MyCompany.TestBench.ConfigurationViewModel। क्या मुझे क्लास का नाम कहीं जोड़ना है?
नबंल

3
धन्यवाद। मुझे कहीं भी नेस्टेड प्रकार के लिए सिंटैक्स नहीं मिला। "+" वाक्यविन्यास कहाँ प्रलेखित है? मैं इसे MSDN या WPF पुस्तकों में नहीं पा सकता। मैंने सोचा कि यह एक्स में होना चाहिए : स्टेटिक मार्कअप एक्सटेंशन लेकिन यह नहीं है।
skst

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>

ReSharper का उपयोग कर रहे हैं, और यदि DataContext ठीक तरह से स्थापित है, वहाँ IntelliSense जब आप हिट हो जाएगा .के बाद StatusIcon, यानी यह enum जो कर रहे हैं के गुणों दिखाएगा Debug, Info, Warningया Error

यदि ReSharper का उपयोग कर रहा है, तो यह XAML फ़ाइल के लिए शीर्षलेख में नामस्थान के लिए निम्न अद्यतन का सुझाव देगा (इसकी तरह अच्छा)):

xmlns:my="clr-namespace:Class.Path.MyViewModel;assembly=MyAssembly"

और वीमॉडल:

public enum StatusIcon
{
    Debug,
    Info,
    Warning,
    Error
}

public class MyViewModel
{
    public StatusIcon StatusIcon { get; }
}

हम Fodyस्वचालित बाध्यकारी के लिए भी उपयोग करते हैं।


क्या आप फोडी के प्रॉपर्टीचेंज प्रोजेक्ट का जिक्र कर रहे हैं?
उउदद्ल्र्र्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.