.net আমি কিভাবে রিপ্লেটিভসোর্স সঙ্গে WPF বাইন্ডিং ব্যবহার করবেন?




xaml data-binding (12)

যদি একটি উপাদান ভিজ্যুয়াল ট্রি অংশ না হয়, তাহলে আপেক্ষিক সফটওয়্যার কাজ করবে না।

এই ক্ষেত্রে, আপনি থমাস Levesque দ্বারা অগ্রণী, একটি ভিন্ন কৌশল চেষ্টা করতে হবে।

ডেটাকন্টেস্ট উত্তরাধিকারসূত্রে প্রাপ্ত না হওয়া পর্যন্ত ডেটাতে কীভাবে বদ্ধ করা যায় তার [WPF] অধীনে তার ব্লগে সমাধান রয়েছে। এবং এটি একেবারে উজ্জ্বলভাবে কাজ করে!

তার ব্লগে যে অসম্ভাব্য ঘটনা ঘটেছে, এপেনডেক্স এ তার নিবন্ধের একটি আয়না কপি রয়েছে।

এখানে মন্তব্য করবেন না দয়া করে সরাসরি তার ব্লগ পোস্টে মন্তব্য করুন

পরিশিষ্ট এ: ব্লগের পোস্টের মিরর

ডাব্লুএফএফ-তে ডেটা কানেক্সটেক্ট সম্পত্তিটি অত্যন্ত সহজ, কারণ এটি স্বয়ংক্রিয়ভাবে এটির সমস্ত সন্তানদের দ্বারা উত্তরাধিকারী হয় যেখানে আপনি এটি বরাদ্দ করেন; অতএব আপনি যে উপাদানটি বাঁধতে চান তার উপর আবার সেট করতে হবে না। যাইহোক, কিছু ক্ষেত্রে ডেটাকন্টেক্স অ্যাক্সেসযোগ্য নয়: এটি এমন উপাদানগুলির জন্য ঘটে যা দৃশ্যমান বা লজিক্যাল গাছের অংশ নয়। তারপর ঐ উপাদানের উপর একটি সম্পত্তি বাঁধন করা খুব কঠিন হতে পারে ...

আসুন একটি সহজ উদাহরণ দিয়ে চিত্রিত করি: আমরা একটি ডেটা গ্রীডে পণ্যগুলির একটি তালিকা প্রদর্শন করতে চাই। গ্রিডে, আমরা ভিউমোডেল দ্বারা উন্মুক্ত ShowPrice সম্পত্তির মানের উপর ভিত্তি করে মূল্য কলামটি প্রদর্শন বা লুকাতে সক্ষম হতে চাই। সুস্পষ্ট পদ্ধতিটি ShowPrice সম্পত্তিটিতে কলামের দৃশ্যমানতা বদ্ধ করা:

<DataGridTextColumn Header="Price" Binding="{Binding Price}" IsReadOnly="False"
                Visibility="{Binding ShowPrice,
                Converter={StaticResource visibilityConverter}}"/>

দুর্ভাগ্যবশত, ShowPrice এর মান পরিবর্তন করাটির কোন প্রভাব নেই, এবং কলাম সর্বদা দৃশ্যমান ... কেন? আমরা যদি ভিজ্যুয়াল স্টুডিওতে আউটপুট উইন্ডোটি দেখি, তবে আমরা নিম্নলিখিত লাইনটি লক্ষ্য করি:

System.Windows.Data ত্রুটি: 2: লক্ষ্য উপাদান জন্য গভর্নিং ফ্রেমওয়ার্কমেন্ট বা ফ্রেমওয়ার্ক কনটেন্টমেন্ট খুঁজে পাচ্ছি না। BindingExpression: পাথ = ShowPrice; DataItem = নাল; টার্গেট উপাদানটি 'ডেটাগ্রিডটেক্সট কলাম' (হ্যাশকোড = 32685253); লক্ষ্য সম্পত্তি 'দৃশ্যমানতা' (টাইপ 'দৃশ্যমানতা')

বার্তাটি বরং রহস্যজনক, তবে অর্থটি আসলেই বেশ সহজ: ডটকমটিক্সটি পেতে কোন ফ্রেমওয়ার্কটি ব্যবহার করতে হবে তা WPF জানে না, কারণ কলামটি ডেটাগ্রিডের দৃশ্যমান বা লজিক্যাল গাছের অন্তর্গত নয়।

আমরা পছন্দসই ফলাফল পেতে বাঁধাই টিপে চেষ্টা করতে পারি, উদাহরণস্বরূপ, আপেক্ষিক সোর্সটি ডেটাগার্ডে নিজেই স্থাপন করে:

<DataGridTextColumn Header="Price" Binding="{Binding Price}" IsReadOnly="False"
                Visibility="{Binding DataContext.ShowPrice,
                Converter={StaticResource visibilityConverter},
                RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}"/>

অথবা আমরা ShowPrice এ আবদ্ধ একটি চেকবক্স যুক্ত করতে পারি এবং উপাদান নামটি নির্দিষ্ট করে ইসচেক্ড সম্পত্তিটিতে কলাম দৃশ্যমানতা বদ্ধ করার চেষ্টা করতে পারি:

<DataGridTextColumn Header="Price" Binding="{Binding Price}" IsReadOnly="False"
                Visibility="{Binding IsChecked,
                Converter={StaticResource visibilityConverter},
                ElementName=chkShowPrice}"/>

কিন্তু এই কাজের কোনও কাজ কাজ বলে মনে হচ্ছে না, আমরা সবসময় একই ফলাফল পাই ...

এই মুহুর্তে, মনে হচ্ছে যে একমাত্র কার্যকর পদ্ধতিটি কোড-পিছু কলাম দৃশ্যমানতা পরিবর্তন করতে হবে, যা আমরা সাধারণত এমভিভিএম প্যাটার্ন ব্যবহার করার সময় এড়াতে পছন্দ করি ... কিন্তু আমি তাড়াতাড়ি তা ছেড়ে দিতে যাচ্ছি না, অন্তত to বিবেচনা করার জন্য অন্যান্য অপশন আছে

আমাদের সমস্যার সমাধানটি বেশ সহজ, এবং Freezable ক্লাসের সুবিধা নেয়। এই বর্গটির প্রাথমিক উদ্দেশ্য এমন একটি বস্তুকে সংজ্ঞায়িত করা যা সংশোধনযোগ্য এবং কেবলমাত্র পঠনযোগ্য রাষ্ট্র রয়েছে, কিন্তু আমাদের ক্ষেত্রে আকর্ষণীয় বৈশিষ্ট্যটি হল যে মুক্ত বস্তুগুলি দৃশ্যমান বা লজিক্যাল গাছের মধ্যে থাকা না থাকলেও ডেটাকন্টেটে উত্তরাধিকারী হতে পারে। আমি এই আচরণকে সক্ষম করে এমন সঠিক প্রক্রিয়াটি জানি না, তবে আমরা আমাদের বাঁধাই কাজটি করার জন্য এটির সুবিধা নিতে যাচ্ছি ...

ধারণাটি হল একটি শ্রেণি তৈরি করা (আমি এটিকে বাইন্ডিংপ্রক্সি বলা কারণগুলির জন্য শীঘ্রই খুব তাৎপর্যপূর্ণ হওয়া উচিত) যা ফ্রিজে উত্তরাধিকারী এবং ডেটা নির্ভরতার সম্পত্তি ঘোষণা করে:

public class BindingProxy : Freezable
{
    #region Overrides of Freezable

    protected override Freezable CreateInstanceCore()
    {
        return new BindingProxy();
    }

    #endregion

    public object Data
    {
        get { return (object)GetValue(DataProperty); }
        set { SetValue(DataProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Data.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty DataProperty =
        DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));
}

তারপরে আমরা DataGrid এর সংস্থানগুলিতে এই শ্রেণির একটি উদাহরণ ঘোষণা করতে পারি এবং ডেটা সম্পত্তিটিকে বর্তমান ডেটাকন্টেটে বাঁধতে পারি:

<DataGrid.Resources>
    <local:BindingProxy x:Key="proxy" Data="{Binding}" />
</DataGrid.Resources>

শেষ ধাপটি বাইন্ডিংপ্রক্সি অবজেক্টটি (স্ট্যাটিক রিসোর্স সহ সহজেই অ্যাক্সেসযোগ্য) নির্দিষ্ট করার জন্য উত্স হিসাবে নির্দিষ্ট করা:

<DataGridTextColumn Header="Price" Binding="{Binding Price}" IsReadOnly="False"
                Visibility="{Binding Data.ShowPrice,
                Converter={StaticResource visibilityConverter},
                Source={StaticResource proxy}}"/>

উল্লেখ্য যে বাঁধাই পথটি "ডেটা" দিয়ে প্রিফিক্স করা হয়েছে, কারণ পাথটি এখন বাইন্ডিংপ্রক্সি বস্তুর সাথে সম্পর্কিত।

বাঁধাই এখন সঠিকভাবে কাজ করে এবং ShowPrice সম্পত্তি ভিত্তিক কলাম সঠিকভাবে দেখানো বা লুকানো।

আমি কিভাবে WPF বাইন্ডিং RelativeSource ব্যবহার করব এবং বিভিন্ন ব্যবহারের ক্ষেত্রে কী কী?


যদি আপনি বস্তুর অন্য সম্পত্তি থেকে বাঁধতে চান:

{Binding Path=PathToProperty, RelativeSource={RelativeSource Self}}

আপনি যদি পূর্বপুরুষের সম্পত্তি পেতে চান:

{Binding Path=PathToProperty,
    RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}}

আপনি যদি templated পিতামাতার উপর একটি সম্পত্তি পেতে চান (তাই আপনি একটি কন্ট্রোল টেম্পলেট মধ্যে 2 উপায় বাঁধাই করতে পারেন)

{Binding Path=PathToProperty, RelativeSource={RelativeSource TemplatedParent}}

অথবা, সংক্ষিপ্ত (এটি শুধুমাত্র ওয়ানওয়ে বাইন্ডিংয়ের জন্য কাজ করে):

{TemplateBinding Path=PathToProperty}

এটি এই প্যাটার্নের ব্যবহার সম্পর্কে একটি উদাহরণ যা আমার জন্য খালি ডেটগ্রিডে কাজ করেছে।

<Style.Triggers>
    <DataTrigger Binding="{Binding Items.Count, RelativeSource={RelativeSource Self}}" Value="0">
        <Setter Property="Background">
            <Setter.Value>
                <VisualBrush Stretch="None">
                    <VisualBrush.Visual>
                        <TextBlock Text="We did't find any matching records for your search..." FontSize="16" FontWeight="SemiBold" Foreground="LightCoral"/>
                    </VisualBrush.Visual>
                </VisualBrush>
            </Setter.Value>
        </Setter>
    </DataTrigger>
</Style.Triggers>

আমি শুধু আমার জন্য কাজ করে যে Silverlight মধ্যে একটি পিতামাতার উপাদান ডেটাContext অ্যাক্সেস করার জন্য আরেকটি সমাধান পোস্ট। এটি Binding ElementName ব্যবহার করে।


আমি প্রতিটি উত্তর পড়িনি, কিন্তু আমি কেবলমাত্র একটি বোতামের আপেক্ষিক উৎস কমান্ডের বাঁধনের ক্ষেত্রে এই তথ্য যুক্ত করতে চাই।

আপনি Mode=FindAncestor সঙ্গে একটি আপেক্ষিক উৎস ব্যবহার করার Mode=FindAncestor , বাঁধাই এরকম হতে হবে:

Command="{Binding Path=DataContext.CommandProperty, RelativeSource={...}}"

আপনি যদি আপনার পথে ডেটাকন্টেস্ট যুক্ত না করেন তবে কার্যকর সময়ে এটি সম্পত্তি পুনরুদ্ধার করতে পারবেন না।


Binding RelativeSource={
    RelativeSource Mode=FindAncestor, AncestorType={x:Type ItemType}
}
...

RelativeSource ডিফল্ট বৈশিষ্ট্য Mode সম্পত্তি। বৈধ মানগুলির একটি সম্পূর্ণ সেট এখানে দেওয়া হয়েছে ( MSDN থেকে ):

  • পূর্ববর্তী তথ্যটি প্রদর্শিত তথ্য আইটেমগুলির তালিকায় পূর্ববর্তী ডেটা আইটেমটি (ডাটা কন্ট্রোলটি না থাকে এমন নিয়ন্ত্রণে) সংযুক্ত করতে দেয়।

  • টেমপ্লেটডেন্ট উপাদানটি যা টেম্পলেট (যা তথ্য-আবদ্ধ উপাদান বিদ্যমান) প্রয়োগ করে। এটি একটি টেম্পলেট বাইন্ডিং এক্সটেনশান সেট করার মতো এবং এটি কেবল তখনই প্রযোজ্য যখন বাইন্ডিংটি একটি টেম্পলেটের মধ্যে থাকে।

  • স্বয়ং আপনি যে উপাদানটি বাঁধাই করছেন তার প্রতিফলন করে এবং আপনি একই উপাদানটির অন্য একটি সম্পত্তিতে সেই উপাদানটির একটি সম্পত্তি বাঁধতে পারবেন।

  • খুঁজুন পূর্বপুরুষ তথ্য-আবদ্ধ উপাদান পিতামাতার শৃঙ্খলে পূর্বপুরুষকে উল্লেখ করে। আপনি এটি একটি নির্দিষ্ট ধরনের বা তার উপশ্রেণীগুলির পূর্বপুরুষের সাথে যুক্ত করতে ব্যবহার করতে পারেন। যদি আপনি পূর্বপুরুষ টাইপ এবং / বা পূর্বপুরুষ লেভেল নির্দিষ্ট করতে চান তবে এই মোডটি ব্যবহার করুন।


এটি নোট যোগ্য যে সিলভারলাইটের এই চিন্তাধারা জুড়ে যারা হোঁচট খাচ্ছে তাদের জন্য:

সিলভারাইট শুধুমাত্র এই কমান্ডগুলির একটি হ্রাসযোগ্য উপসেট সরবরাহ করে


এখানে একটি এমভিভিএম আর্কিটেকচারের প্রেক্ষাপটে আরও বেশি চাক্ষুষ ব্যাখ্যা রয়েছে:


এই ক্ষেত্রে কল্পনা করুন, একটি আয়তক্ষেত্র যা আমরা চাই যে তার উচ্চতা তার প্রস্থের সমান হবে, একটি বর্গক্ষেত্রের কথা বলা যাক। আমরা উপাদান নাম ব্যবহার করে এই কাজ করতে পারেন

<Rectangle Fill="Red" Name="rectangle" 
                    Height="100" Stroke="Black" 
                    Canvas.Top="100" Canvas.Left="100"
                    Width="{Binding ElementName=rectangle,
                    Path=Height}"/>

কিন্তু এই উপরের ক্ষেত্রে আমরা বাধ্যতামূলক বস্তুর নামটি বোঝাতে বাধ্য, যেমন আয়তক্ষেত্র। আমরা রিলেটিভসোর্স ব্যবহার করে ভিন্ন উদ্দেশ্যে একই উদ্দেশ্যে পৌঁছাতে পারি

<Rectangle Fill="Red" Height="100" 
                   Stroke="Black" 
                   Width="{Binding RelativeSource={RelativeSource Self},
                   Path=Height}"/>

যে ক্ষেত্রে আমরা বাঁধাই বস্তুর নাম উল্লেখ করতে বাধ্য নই এবং যখন উচ্চতা পরিবর্তিত হয় তখন প্রস্থ সর্বদা উচ্চতা সমান হবে।

যদি আপনি উচ্চতার অর্ধেক প্রস্থের প্যারামিটারটি প্যারামিটার করতে চান তবে আপনি বাইন্ডিং মার্কআপ এক্সটেনশনটিতে একটি রূপান্তরকারী যুক্ত করে এটি করতে পারেন। আসুন এখন আরেকটি ক্ষেত্রে কল্পনা করি:

 <TextBlock Width="{Binding RelativeSource={RelativeSource Self},
                   Path=Parent.ActualWidth}"/>

উপরের ক্ষেত্রে একটি নির্দিষ্ট উপাদানটির প্রদত্ত সম্পত্তিটি তার সরাসরি পিতামাতার একটিকে টাই করার জন্য ব্যবহার করা হয় কারণ এই উপাদানটি এমন একটি সম্পত্তি ধারণ করে যা পিতাকে বলা হয়। এটি আমাদের অন্য অপেক্ষাকৃত উৎস মোডে নিয়ে যায় যা FindAcestor one।


WPF RelativeSource সোর্স বাইন্ডিং সেট করতে তিনটি properties প্রকাশ করে:

1. মোড: এটি একটি enum যা চারটি মান থাকতে পারে:

ক। পূর্ববর্তী ডেটা ( value=0 ): এটি পূর্বের property পূর্ববর্তী মানটি নির্দিষ্ট করে

খ। TemplatedParent ( value=1 ): এটি ব্যবহার করা হয় যখন কোনো নিয়ন্ত্রণের templates সংজ্ঞায়িত করা এবং নিয়ন্ত্রণের মান / সম্পত্তি সংযুক্ত করতে চান।

উদাহরণস্বরূপ, ControlTemplate সংজ্ঞায়িত করুন:

  <ControlTemplate>
        <CheckBox IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
 </ControlTemplate>

গ। স্ব ( value=2 ): যখন আমরা self অথবা আত্মীয় property থেকে বাঁচতে চাই।

উদাহরণস্বরূপ: checkbox Command নির্ধারণ করার সময় CommandParameter হিসাবে checkbox পাঠান

<CheckBox ...... CommandParameter="{Binding RelativeSource={RelativeSource Self},Path=IsChecked}" />

ঘ। FindAcestor ( value=3 ): যখন Visual Tree কোনও পিতামাতার control থেকে বাঁধতে চান।

উদাহরণস্বরূপ: একটি grid , যদি header checkbox চেক করা হয় তবে records একটি checkbox বাঁধুন

<CheckBox IsChecked="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type iDP:XamDataGrid}}, Path=DataContext.IsHeaderChecked, Mode=TwoWay}" />

2. পূর্বপুরুষ টাইপ : যখন মোড খুঁজুন FindAncestor তারপর পূর্বপুরুষ কি ধরনের সংজ্ঞায়িত

RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type iDP:XamDataGrid}}

3. পূর্বপুরুষঃ যখন মোডটি পূর্বপুরুষকে খুঁজে পাওয়া FindAncestor তখন পূর্বপুরুষের কোন স্তর (যদি visual tree দুটি পিতামাতার একই রকম visual tree )

RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type iDP:XamDataGrid, AncestorLevel=1}}

RelativeSource binding জন্য সকল ব্যবহার-কেস উপরে।

এখানে একটি রেফারেন্স লিঙ্ক


কিছু দরকারী বিট এবং টুকরা:

কোডে বেশিরভাগ ক্ষেত্রে কীভাবে এটি করতে হয়:

Binding b = new Binding();
b.RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, this.GetType(), 1);
b.Path = new PropertyPath("MyElementThatNeedsBinding");
MyLabel.SetBinding(ContentProperty, b);

আমি মূলত কোড পিছনে কোড বাইন্ডিং আপেক্ষিক উত্স থেকে এই কপি।

এছাড়াও, MSDN পৃষ্ঠাটি যতদূর উদাহরণ যেতে পারে তত ভাল: আপেক্ষিক সোর্স ক্লাস


বেচির বেজাউই এখানে তার নিবন্ধে ডাব্লুএফএফ-এর আপেক্ষিক সূত্রগুলির ব্যবহার ক্ষেত্রে প্রকাশ করেছেন:

আপেক্ষিক সোর্সটি একটি মার্কআপ এক্সটেনশান যা নির্দিষ্ট বাধ্যতামূলক ক্ষেত্রে ব্যবহার করা হয় যখন আমরা বস্তুর অন্য কোনও সম্পত্তিতে প্রদত্ত বস্তুর কোনও সম্পত্তি সংযুক্ত করার চেষ্টা করি, যখন আমরা বস্তুর সম্পত্তিটিকে তার অন্য আপেক্ষিক পিতামাতার কাছে সংযুক্ত করার চেষ্টা করি, কাস্টম কন্ট্রোল বিকাশের ক্ষেত্রে এবং অবশেষে একটি আবদ্ধ ডেটা সিরিজের একটি ডিফারেনশিয়াল ব্যবহার করার ক্ষেত্রে এক্সএএমএল-এর একটি টুকরাতে একটি নির্ভরশীল সম্পত্তি মানকে বাঁধন করে। সমস্ত পরিস্থিতিতে আপেক্ষিক উৎস মোড হিসাবে প্রকাশ করা হয়। আমি এক এক এক করে সব মামলা প্রকাশ করা হবে।

  1. মোড স্বয়ং:

এই ক্ষেত্রে কল্পনা করুন, একটি আয়তক্ষেত্র যা আমরা চাই যে তার উচ্চতা তার প্রস্থের সমান হবে, একটি বর্গক্ষেত্রের কথা বলা যাক। আমরা উপাদান নাম ব্যবহার করে এই কাজ করতে পারেন

<Rectangle Fill="Red" Name="rectangle" 
                Height="100" Stroke="Black" 
                Canvas.Top="100" Canvas.Left="100"
                Width="{Binding ElementName=rectangle,
                Path=Height}"/>

কিন্তু এই উপরের ক্ষেত্রে আমরা বাধ্যতামূলক বস্তুর নামটি বোঝাতে বাধ্য, যেমন আয়তক্ষেত্র। আমরা রিলেটিভসোর্স ব্যবহার করে ভিন্ন উদ্দেশ্যে একই উদ্দেশ্যে পৌঁছাতে পারি

<Rectangle Fill="Red" Height="100" 
               Stroke="Black" 
               Width="{Binding RelativeSource={RelativeSource Self},
               Path=Height}"/>

যে ক্ষেত্রে আমরা বাঁধাই বস্তুর নাম উল্লেখ করতে বাধ্য নই এবং যখন উচ্চতা পরিবর্তিত হয় তখন প্রস্থ সর্বদা উচ্চতা সমান হবে।

যদি আপনি উচ্চতার অর্ধেক প্রস্থের প্যারামিটারটি প্যারামিটার করতে চান তবে আপনি বাইন্ডিং মার্কআপ এক্সটেনশনটিতে একটি রূপান্তরকারী যুক্ত করে এটি করতে পারেন। আসুন এখন আরেকটি ক্ষেত্রে কল্পনা করি:

 <TextBlock Width="{Binding RelativeSource={RelativeSource Self},
               Path=Parent.ActualWidth}"/>

উপরের ক্ষেত্রে একটি নির্দিষ্ট উপাদানটির প্রদত্ত সম্পত্তিটি তার সরাসরি পিতামাতার একটিকে টাই করার জন্য ব্যবহার করা হয় কারণ এই উপাদানটি এমন একটি সম্পত্তি ধারণ করে যা পিতাকে বলা হয়। এটি আমাদের অন্য অপেক্ষাকৃত উৎস মোডে নিয়ে যায় যা FindAcestor one।

  1. মোড খুঁজুন পূর্বপুরুষ

এই ক্ষেত্রে, একটি প্রদত্ত উপাদান একটি সম্পত্তি তার পিতামাতা, Corse এক আবদ্ধ করা হবে। উপরোক্ত ক্ষেত্রে প্রধান পার্থক্য হল যে, সম্পত্তিটি বাঁধার জন্য অনুক্রমের পূর্বপুরুষের ধরন এবং পূর্বপুরুষের পদ নির্ধারণ করা আপনার পক্ষে। উপায় XAML এই টুকরা সঙ্গে খেলা করার চেষ্টা করুন

<Canvas Name="Parent0">
    <Border Name="Parent1"
             Width="{Binding RelativeSource={RelativeSource Self},
             Path=Parent.ActualWidth}"
             Height="{Binding RelativeSource={RelativeSource Self},
             Path=Parent.ActualHeight}">
        <Canvas Name="Parent2">
            <Border Name="Parent3"
            Width="{Binding RelativeSource={RelativeSource Self},
           Path=Parent.ActualWidth}"
           Height="{Binding RelativeSource={RelativeSource Self},
              Path=Parent.ActualHeight}">
               <Canvas Name="Parent4">
               <TextBlock FontSize="16" 
               Margin="5" Text="Display the name of the ancestor"/>
               <TextBlock FontSize="16" 
                 Margin="50" 
            Text="{Binding RelativeSource={RelativeSource  
                       FindAncestor,
                       AncestorType={x:Type Border}, 
                       AncestorLevel=2},Path=Name}" 
                       Width="200"/>
                </Canvas>
            </Border>
        </Canvas>
     </Border>
   </Canvas>

উপরের পরিস্থিতি দুটি টেক্সটব্লক উপাদানগুলির সীমানা এবং ক্যানভাস উপাদানগুলি যা তাদের আধিপত্যপূর্ণ পিতামাতার প্রতিনিধিত্ব করে। দ্বিতীয় টেক্সটব্লক আপেক্ষিক উত্স স্তরের প্রদত্ত পিতামাতার নাম প্রদর্শন করবে।

অতএব AncestorLevel = 2 কে পূর্বপুরুষ = 1 এ পরিবর্তন করার চেষ্টা করুন এবং দেখুন কি ঘটে। তারপরে পূর্বপুরুষের ধরনটি পূর্বপুরুষ টাইপ = বর্ডার থেকে পূর্বপুরুষ টাইপ = ক্যানভাসের ধরনটি পরিবর্তন করার চেষ্টা করুন এবং দেখুন কী ঘটছে।

প্রদর্শিত টেক্সট পূর্বপুরুষ টাইপ এবং স্তর অনুযায়ী পরিবর্তন হবে। তাহলে কি পূর্বপুরুষের স্তরের পূর্বপুরুষের প্রকারের উপযুক্ত নয়? এটি একটি ভাল প্রশ্ন, আমি জানি যে আপনি এটি জিজ্ঞাসা করতে চলেছেন। প্রতিক্রিয়া কোন ব্যতিক্রম ব্যতিক্রম করা হবে এবং নোটিং টেক্সট ব্লক স্তরের প্রদর্শিত হবে।

  1. TemplatedParent

এই মোডটি কন্ট্রোলট্যাম্পপ্লেট প্রয়োগ করা হয় এমন নিয়ন্ত্রণের একটি সম্পত্তিতে প্রদত্ত ControlTemplate সম্পত্তিটি টাই করতে সক্ষম করে। ভাল সমস্যা এখানে বুঝতে উদাহরণস্বরূপ একটি বellow

<Window.Resources>
<ControlTemplate x:Key="template">
        <Canvas>
            <Canvas.RenderTransform>
                <RotateTransform Angle="20"/>
                </Canvas.RenderTransform>
            <Ellipse Height="100" Width="150" 
                 Fill="{Binding 
            RelativeSource={RelativeSource TemplatedParent},
            Path=Background}">

              </Ellipse>
            <ContentPresenter Margin="35" 
                  Content="{Binding RelativeSource={RelativeSource  
                  TemplatedParent},Path=Content}"/>
        </Canvas>
    </ControlTemplate>
</Window.Resources>
    <Canvas Name="Parent0">
    <Button   Margin="50" 
              Template="{StaticResource template}" Height="0" 
              Canvas.Left="0" Canvas.Top="0" Width="0">
        <TextBlock FontSize="22">Click me</TextBlock>
    </Button>
 </Canvas>

আমি যদি তার নিয়ন্ত্রণ টেমপ্লেটটিতে প্রদত্ত নিয়ন্ত্রণের বৈশিষ্ট্যগুলি প্রয়োগ করতে চাই তবে আমি টেম্পলেটযুক্ত পিতার মোড ব্যবহার করতে পারি। এই মার্কআপ এক্সটেনশানটির অনুরূপ একটিও রয়েছে যা টেমপ্লেটিং যা প্রথমটির এক ধরনের ছোট হাতের, কিন্তু টেম্পলেট বাইন্ডিংটি টেম্প্লেটেড প্যারেন্টের বিপরীতে কম্পাইল সময়টিতে মূল্যায়ন করা হয় যা প্রথম রান করার পরে মূল্যায়ন করা হয়। আপনি নিচু চিত্রের মধ্যে মন্তব্য করতে পারেন হিসাবে, পটভূমি এবং বিষয়বস্তু বোতামের মধ্যে নিয়ন্ত্রণ টেমপ্লেট থেকে প্রয়োগ করা হয়।





relativesource