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




xaml data-binding (10)

TemplatedParent ভুলবেন না:

<Binding RelativeSource="{RelativeSource TemplatedParent}"/>

অথবা

{Binding RelativeSource={RelativeSource TemplatedParent}}

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


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

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

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

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


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


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

<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।


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

<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>

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

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


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

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

  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>

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


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

{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}

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 RelativeSource={
    RelativeSource Mode=FindAncestor, AncestorType={x:Type ItemType}
}
...

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

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

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

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

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





relativesource