লিস্টবক্স আইটেম নির্বাচন করা থাকলে ডাব্লুপিএফ ডেটা টেম্প্লেট পরিবর্তন করুন


91

আইটেমটি নির্বাচন করা হয়েছে কি না তার উপর নির্ভর করে একটি তালিকাবক্সে আইটেমগুলির জন্য আমাকে ডেটা টেম্পলেট পরিবর্তন করতে হবে (নির্বাচিত হওয়ার সময় বিভিন্ন / আরও তথ্য প্রদর্শন করা হবে)।

প্রশ্নে থাকা তালিকাবক্স আইটেমটি ক্লিক করার সময় ডেটাটেম্পলেট (একটি স্ট্যাকপ্যানেল) এর সর্বাধিক উপাদানটিতে আমি গটফোকস / লস্টফোকাস ইভেন্ট পাই না এবং আমি ধারণার বাইরে আছি।

উত্তর:


184

এটি করার সবচেয়ে সহজ উপায় হ'ল "আইটেমকন্টেইনার স্টাইল" এর জন্য একটি টেম্পলেট সরবরাহ করা এবং "আইটেম টেম্পলেট" সম্পত্তিটি নয়। নীচের কোডগুলিতে আমি 2 ডেটা টেম্পলেট তৈরি করি: একটি "নির্বাচিত" এবং একটি "নির্বাচিত" রাজ্যের জন্য। তারপরে আমি "আইটেমকন্টেইনার স্টাইল" এর জন্য একটি টেম্পলেট তৈরি করি যা আসল "লিস্টবক্সআইটেম" এতে আইটেম রয়েছে। আমি "নির্বাচিত" স্থিতিতে ডিফল্ট "কনটেন্টপ্যাম্পলেট" সেট করেছিলাম এবং তারপরে একটি ট্রিগার সরবরাহ করি যা "ইসসলেক্টেড" সম্পত্তিটি সত্য হলে টেম্পলেটটি সরিয়ে আনে। (দ্রষ্টব্য: আমি সরলতার জন্য স্ট্রিংগুলির তালিকার পিছনে কোডে "আইটেমসোর্স" সম্পত্তিটি সেট করছি)

<Window.Resources>

<DataTemplate x:Key="ItemTemplate">
    <TextBlock Text="{Binding}" Foreground="Red" />
</DataTemplate>

<DataTemplate x:Key="SelectedTemplate">
    <TextBlock Text="{Binding}" Foreground="White" />
</DataTemplate>

<Style TargetType="{x:Type ListBoxItem}" x:Key="ContainerStyle">
    <Setter Property="ContentTemplate" Value="{StaticResource ItemTemplate}" />
    <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="ContentTemplate" Value="{StaticResource SelectedTemplate}" />
        </Trigger>
    </Style.Triggers>
</Style>

</Window.Resources>
<ListBox x:Name="lstItems" ItemContainerStyle="{StaticResource ContainerStyle}" />

4
আপনাকে ধন্যবাদ, দয়া করে আপনার পোস্টে <লিস্টবক্স আইটেমকন্টেইনার স্টাইল = "{স্ট্যাটিক রিসোর্স কনটেইনার স্টাইল}" আইটেমসোর্স = "My বাইন্ডিং মাইডাটা}" /> অন্তর্ভুক্ত করুন, যাতে লোকেরা আপনার ব্লগে অনুসন্ধান করতে হয় না।
শিমি ওয়েটজ্যান্ডলার

4
লিস্টবক্সের কনটেইনারস্টাইল সেট করার ক্ষেত্রে আমি যে সমস্যার মুখোমুখি হয়েছি তা হ'ল এটি থিমগুলির সাথে অসঙ্গতি সৃষ্টি করে। আমি আপনার পদ্ধতির ব্যবহার করেছি, তবে আমি ডাব্লুপিএফ ফিউচারের থিমটি প্রয়োগ করার পরে তালিকাবক্সআইটেমগুলির থিম স্টাইলিংয়ের পরিবর্তে ডিফল্ট স্টাইলিং ছিল। আমার ক্ষেত্রে, কালো ব্যাকগ্রাউন্ডে কালো পাঠ্য এবং সাধারণ কদর্যতা। আমি এখনও অন্য পদ্ধতির সন্ধান করছি, সম্ভবত ডেটাপ্যাম্পলেট ট্রিগার ব্যবহার করে।
বেনি জোবিগান

4
এছাড়াও, আপনি যদি চান যে আপনার নতুন আইটেমকন্টেইনার স্টাইল থিমগুলির সাথে সামঞ্জস্যপূর্ণ হয় তবে আপনাকে এটি থিমের ভিত্তিতে তৈরি করতে হবে। এটি করতে, BasedOn="{StaticResource {x:Type ListBoxItem}}"তালিকাবক্সের সাথে ব্যবহার করুন । এটি ট্রিভিউয়ের মতো অন্যান্য নিয়ন্ত্রণগুলিতেও প্রযোজ্য।
বেনি জোবিগান

4
এটি ব্যবহার করে আমি দেখতে পেলাম যে আরকেন এক্সএএমএল ত্রুটিগুলি না পাওয়ার জন্য আমাকে রিসোর্স বিভাগে স্টাইলের উপরে ডেটা টেম্পলেটগুলি ঘোষণা করতে হয়েছিল। এটি সম্পর্কে একটি মাথা আপ।
রব পারকিনস

8

যখন আইটেমটি নির্বাচিত হয় বা স্টাইল সেট করার জন্য আপনাকে যা করতে হবে তা হ'ল ListBoxItemআপনার <DataTemplate>এবং পিতা-মাতাকে পুনরুদ্ধার করা যখন স্টাইল পরিবর্তন হয় তখন তার IsSelectedপরিবর্তন হয়। উদাহরণস্বরূপ নীচের কোডটি TextBlockডিফল্ট Foregroundরঙের সবুজ সহ একটি তৈরি করবে । এখন আইটেমটি নির্বাচিত হয়ে গেলে ফন্টটি লাল হয়ে যাবে এবং যখন মাউসটি শেষ হবে তখন এটি হলুদ হয়ে যাবে । আপনি যে রাজ্যের সামান্য পরিবর্তন করতে চান তার জন্য অন্যান্য উত্তরে প্রস্তাবিতভাবে আপনাকে আলাদা ডেটা টেম্পলেট নির্দিষ্ট করার দরকার নেই।

<DataTemplate x:Key="SimpleDataTemplate">
    <TextBlock Text="{Binding}">
        <TextBlock.Style>
            <Style>
                <Setter Property="TextBlock.Foreground" Value="Green"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path=IsSelected, RelativeSource={
                        RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem }}}"
                                 Value="True">
                        <Setter Property="TextBlock.Foreground" Value="Red"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Path=IsMouseOver, RelativeSource={
                        RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem }}}"
                                 Value="True">
                        <Setter Property="TextBlock.Foreground" Value="Yellow"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBlock.Style>
    </TextBlock>
</DataTemplate>

4
আমি যেমন প্রশ্নে লিখেছি, নির্বাচিত হলে আমি আসলে আরও তথ্য দেখাব ("নির্বাচিত হওয়ার পরে বিভিন্ন / আরও তথ্য প্রদর্শন করা হয় ")। তবুও, যদি কিছু উপাদানের টগলিং দৃশ্যমানতার সাথে এটি কাজ করা যায় (তারা আকার নেয় কিনা তাও অন্তর্ভুক্ত), এটি একটি কার্যকর সমাধান হবে। যদিও কিছুক্ষণের জন্য ডব্লিউপিএফের সাথে কাজ করেননি।
ড্যানিয়েল বেক

6

এটিও লক্ষ করা উচিত, স্ট্যাক্প্যানেলটি মনোনিবেশযোগ্য নয়, সুতরাং এটি কখনই ফোকাস পেতে চলে না (ফোকাসেবল = সেট করুন যদি আপনি / সত্যই / এটি মনোনিবেশ করতে চান)। যাইহোক, এই জাতীয় পরিস্থিতিতে মনে রাখার চাবিকাঠিটি হ'ল স্ট্যাকপ্যানেল ট্রিভিউআইটেমের সন্তান , যা এই ক্ষেত্রে আইটেমকন্টেইনার। মিকার পরামর্শ অনুসারে, আইটেমকন্টেনারস্টাইলকে টুইট করা একটি ভাল পদ্ধতির।

আপনি সম্ভবত এটি ডেটা টেম্পলেটগুলি এবং ডেটাট্রিগারের মতো জিনিসগুলি ব্যবহার করতে পারেন যা তালিকাভিউটিমে দেখার জন্য রিলেটিভসউস মার্কআপ এক্সটেনশন ব্যবহার করবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.