চিত্র পরিবর্তন করতে এনামে ডেটাট্রিগার


103

আমি একটি স্থির পটভূমি চিত্র সহ একটি বোতাম পেয়েছি এবং তার উপরে একটি ছোট ওভারলে চিত্র দেখাতে চাই। কোন ওভারলে চিত্রটি বেছে নেওয়া হয়েছে তা 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। সমস্যার উত্সটি কি PingStatusএক্সএএমএল-তে কোনও অজানা গণনা হতে পারে ?


সম্পর্কিত: স্ট্যাকওভারফ্লো.com / q / 10250925 / 590790 যদিও এই লোকটি এটি ইতিমধ্যে কাজ করছে।
স্টিভেন জিউরিস

উত্তর:


249

এই কাজটি পেতে আপনার 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}">

লক্ষ্য করুন যে এনাম টাইপটি আপনাকে উপরে বর্ণিত xMLns উপসর্গের সাথে অবশ্যই উপসর্গযুক্ত করা উচিত।

সম্পাদনা করুন:

যদি আপনার এনাম কোনও শ্রেণীর মধ্যে ঘোষণা করা হয় তবে আপনাকে সিনট্যাক্সটি ব্যবহার করতে হবে:

{x:Static namespace:ClassName+EnumName.EnumValue}

উদাহরণ স্বরূপ:

{x:Static my:ConfigurationViewModel+PingStatus.PING_UNKNOWN}


4
আমি এটির xmlnsমতো যুক্ত করেছি : xmlns:local="clr-namespace:MyCompany.Testbench"এবং এটির মতো ট্রিগারও <DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="{x:Static local:PingStatus.PING_UNKNOWN}">। না আমি ত্রুটি পাই Cannot find the type 'PingStatus'
নব্বুল্ক

4
enum PingStatusশ্রেণীর ভিতরে সংজ্ঞায়িত করা হয় MyCompany.TestBench.ConfigurationViewModel। আমাকে কি কোথাও ক্লাসের নাম যুক্ত করতে হবে?
নবুলকে

4
ধন্যবাদ. আমি কোথাও নেস্টেড টাইপের জন্য সিনট্যাক্সটি খুঁজে পাইনি। "+" সিনট্যাক্স নথিভুক্ত কোথায়? আমি এটি এমএসডিএন বা ডাব্লুপিএফ বইগুলিতে পাই না। আমি ভেবেছিলাম এটি x এ হওয়া উচিত : স্ট্যাটিক মার্কআপ এক্সটেনশন তবে এটি তা নয়।
স্কেস্ট

4
@ এসকিএসটি + চিহ্নটি নীড়যুক্ত নেমস্পেস থেকে ধারণকারীর প্রকারটিকে পৃথক করে। Type t = typeof (System.Environment.SpecialFolder); Console.WriteLine (t.FullName); // prints System.Environment+SpecialFolder


3

ডাব্লুপিএফ + এমভিভিএমের জন্য সম্পূর্ণ কাজের উদাহরণ।

এমএসভিসি 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

যদি রিশার্পার ব্যবহার করা হয় তবে এটি এক্সএএমএল ফাইলের জন্য শিরোনামের নেমস্পেসে নিম্নলিখিত আপডেটটি প্রস্তাব করবে (এটি এর মতো ভাল):

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

এবং ভিওমডেল:

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

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

আমরা Fodyস্বয়ংক্রিয় বাইন্ডিংয়ের জন্যও ব্যবহার করি ।


আপনি কি ফডির সম্পত্তি পরিবর্তন প্রকল্পটি উল্লেখ করছেন?
ইউইউডিডিএলআরএলআরএস

0

আপনি কেবল ডাটা ট্রাইগার মান হিসাবে এনাম মান সেট করতে পারেন ... এমএসভিসি 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="Warning">
                    <Setter Property="Foreground" Value="Yellow"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding StatusIcon}" Value="Error">
                    <Setter Property="Foreground" Value="Red}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.