উত্তর:
সাধারণত একটি নিয়ন্ত্রণ তার নিজের জন্য রেন্ডার করা হয়, এবং অন্তর্নিহিত ডেটা প্রতিফলিত করে না। উদাহরণস্বরূপ, একটি Button
কোনও ব্যবসায়িক অবজেক্টের সাথে আবদ্ধ হবে না - এটি সেখানে খাঁটিভাবে ক্লিক করা যায়। এ ContentControl
বা ListBox
তবে সাধারণত উপস্থিত হয় যাতে তারা ব্যবহারকারীর জন্য ডেটা উপস্থাপন করতে পারে।
এ DataTemplate
, তাই অন্তর্নিহিত তথ্যগুলির জন্য ভিজ্যুয়াল কাঠামো সরবরাহ করতে ব্যবহৃত হয়, তবে এর অন্তর্নিহিত ডেটাগুলির সাথে কোনও ControlTemplate
সম্পর্ক নেই এবং কেবলমাত্র নিয়ন্ত্রণের জন্য ভিজ্যুয়াল বিন্যাস সরবরাহ করে।
একজন ControlTemplate
সাধারণত শুধুমাত্র উপস্থিত থাকবে TemplateBinding
এক্সপ্রেশন, বাঁধাই নিয়ন্ত্রণ নিজেই বৈশিষ্ট্য পিছনে, যখন একটি DataTemplate
মান বাঁধাই এক্সপ্রেশন উপস্থিত থাকবে, বৈশিষ্ট্য বাঁধাই তার DataContext
(কাজ / ডোমেইন বস্তু বা দৃশ্য মডেল)।
খুব ControlTemplate
সহজেই কোনও কীভাবে একটি নিয়ন্ত্রণ DataTemplate
প্রদর্শন করতে হয় তা বর্ণনা করে যখন কীভাবে ডেটা প্রদর্শন করা যায় describes
উদাহরণ স্বরূপ:
এ Label
একটি নিয়ন্ত্রণ এবং এতে একটি অন্তর্ভুক্ত থাকবে ControlTemplate
যা কিছু সামগ্রীর (একটি বা অন্য কোনও নিয়ন্ত্রণ) Label
ব্যবহার করে প্রদর্শিত হওয়া উচিত বলে উল্লেখ করে ।Border
DataTemplate
একটি Customer
শ্রেণি হ'ল ডেটা এবং এটি ব্যবহার করে প্রদর্শিত হবে DataTemplate
যা বলতে চাইবে যে দুটিতে একটি নাম দেখায় এবং অন্যটি ফোন নম্বর প্রদর্শন করে Customer
type এটি উল্লেখ করা সহায়ক হতে পারে যে সমস্ত ক্লাস ব্যবহার করে প্রদর্শিত হয় , আপনি কেবলমাত্র ডিফল্ট টেম্পলেট ব্যবহার করবেন যা বস্তুর পদ্ধতির ফলাফলের জন্য সেট করা সম্পত্তি সহ একটি ।StackPanel
TextBlocks
DataTemplates
TextBlock
Text
ToString
ট্রয়েস লারসনের একটি ভাল ব্যাখ্যা রয়েছেএমএসডিএন ফোরামে
<Window x:Class="WpfApplication7.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <DataTemplate x:Key="ButtonContentTemplate"> <StackPanel Orientation="Horizontal"> <Grid Height="8" Width="8"> <Path HorizontalAlignment="Stretch" Margin="0,0,1.8,1.8" VerticalAlignment="Stretch" Stretch="Fill" Stroke="#FF000000" Data="M0.5,5.7 L0.5,0.5 L5.7,0.5"/> <Path HorizontalAlignment="Stretch" Margin="2,3,0,0" VerticalAlignment="Stretch" Stretch="Fill" Stroke="#FFFFFFFF" Data="M3.2,7.5 L7.5,7.5 L7.5,3.5"/> <Path HorizontalAlignment="Stretch" Margin="1.2,1.4,0.7,0.7" VerticalAlignment="Stretch" Fill="#FFFFFFFF" Stretch="Fill" Stroke="#FF000000" Data="M2.5,2.5 L7.5,7.5"/> <Path HorizontalAlignment="Stretch" Margin="1.7,2.0,1,1" VerticalAlignment="Stretch" Stretch="Fill" Stroke="#FF000000" Data="M3,7.5 L7.5,7.5 L7.5,3.5"/> <Path HorizontalAlignment="Stretch" Margin="1,1,1,1" VerticalAlignment="Stretch" Stretch="Fill" Stroke="#FFFFFFFF" Data="M1.5,6.5 L1.5,1 L6.5,1.5"/> </Grid> <ContentPresenter Content="{Binding}"/> </StackPanel> </DataTemplate> <ControlTemplate TargetType="Button" x:Key="ButtonControlTemplate"> <Grid> <Ellipse Fill="{TemplateBinding Background}"/> <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> </Grid> </ControlTemplate> </Window.Resources> <StackPanel> <Button Template="{StaticResource ButtonControlTemplate}" ContentTemplate="{StaticResource ButtonContentTemplate}" Content="1"/> <Button Template="{StaticResource ButtonControlTemplate}" ContentTemplate="{StaticResource ButtonContentTemplate}" Content="2"/> <Button Template="{StaticResource ButtonControlTemplate}" ContentTemplate="{StaticResource ButtonContentTemplate}" Content="3"/> </StackPanel> </Window>
(টেম্পলেটগুলি স্পষ্টতই চুরি হয়ে গেছে http://msdn.microsoft.com/en-us/library/system.windows.controls.controltemplate.aspx এবং http: .controls.contentcontrol.contenttemplate% 28VS.95% 29.aspx যথাক্রমে)
যাইহোক, কন্ট্রোলটিম্পলেট বাটনটি কীভাবে দেখায় তা স্থির করে, কনটেন্টপেম্পলেটটি বোতামের সামগ্রী কীভাবে দেখায় তা স্থির করে। সুতরাং আপনি সামগ্রীটি আপনার কোনও একটি ডেটা ক্লাসে বেঁধে রাখতে পারেন এবং এটি চাইলেও উপস্থাপন করতে পারেন তবে আপনি এটি চান।
ControlTemplate
: নিয়ন্ত্রণ শৈলী প্রতিনিধিত্ব করে।
DataTemplate
: ডেটা শৈলীর প্রতিনিধিত্ব করে (আপনি কীভাবে আপনার ডেটা প্রদর্শন করতে চান)।
সমস্ত নিয়ন্ত্রণগুলি ডিফল্ট নিয়ন্ত্রণ টেম্পলেট ব্যবহার করে যা আপনি টেম্পলেট সম্পত্তি দ্বারা ওভাররাইড করতে পারেন।
উদাহরণস্বরূপ
Button
টেমপ্লেট একটি নিয়ন্ত্রণ টেম্পলেট।
Button
সামগ্রী টেমপ্লেট একটি ডেটা টেমপ্লেট
<Button VerticalAlignment="Top" >
<Button.Template>
<ControlTemplate >
<Grid>
<Rectangle Fill="Blue" RadiusX="20" RadiusY="20"/>
<Ellipse Fill="Red" />
<ContentPresenter Content="{Binding}">
<ContentPresenter.ContentTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Height="50">
<TextBlock Text="Name" Margin="5"/>
<TextBox Text="{Binding UserName, Mode=TwoWay}" Margin="5" Width="100"/>
<Button Content="Show Name" Click="OnClickShowName" />
</StackPanel>
</DataTemplate>
</ContentPresenter.ContentTemplate>
</ContentPresenter>
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
public String UserName
{
get { return userName; }
set
{
userName = value;
this.NotifyPropertyChanged("UserName");
}
}
ControlTemplate
চাক্ষুষ উপস্থিতি DataTemplate
সংজ্ঞায়িত করে, একটি ডেটা আইটেমের ভিজ্যুয়াল উপস্থিতিকে প্রতিস্থাপন করে।
উদাহরণ: আমি আয়তক্ষেত্র থেকে বৃত্তের ফর্ম => নিয়ন্ত্রণ টেম্পলেট পর্যন্ত একটি বোতামটি দেখাতে চাই।
এবং যদি আপনার নিয়ন্ত্রণে জটিল অবজেক্ট থাকে তবে এটি কেবল কল করে এবং শো করে ToString()
, DataTemplate
আপনি বিভিন্ন সদস্য পেতে এবং ডেটা অবজেক্টের তাদের মানগুলি প্রদর্শন এবং পরিবর্তন করতে পারেন।
উপরের সমস্ত উত্তর দুর্দান্ত তবে একটি মূল পার্থক্য রয়েছে যা মিস হয়েছিল। এটি কখন কী ব্যবহার করবেন সে সম্পর্কে আরও ভাল সিদ্ধান্ত নিতে সহায়তা করে। এটি ItemTemplate
সম্পত্তি:
ডেটা টেম্পলেটটি এমন উপাদানগুলির জন্য ব্যবহৃত হয় যা আপনার আইটেমের বিষয়বস্তুগুলির প্রতিস্থাপনের জন্য আইটেম টেম্প্লেট সম্পত্তি সরবরাহ করে যা আপনি সরবরাহকারীরDataTemplate
মাধ্যমে আবদ্ধ ডেটা অনুযায়ী পূর্বে নির্ধারণ করেন।
তবে যদি আপনার নিয়ন্ত্রণ আপনার জন্য এই বিলাসিতা সরবরাহ না করে তবে আপনি এখনও ContentView
এমন একটি ব্যবহার করতে পারেন যা পূর্বনির্ধারিত থেকে এর সামগ্রী প্রদর্শন করতে পারে ControlTemplate
। মজার বিষয় হল, আপনি রানটাইমের ControlTemplate
সময় আপনার সম্পত্তি পরিবর্তন করতে পারেন ContentView
। আরও একটি বিষয় লক্ষণীয় যে ItemTemplate
সম্পত্তির সাথে নিয়ন্ত্রণগুলির বিপরীতে , আপনার TemplateSelector
(কন্টেন্টভিউ) নিয়ন্ত্রণের জন্য এটি থাকতে পারে না । তবে আপনি ControlTemplate
রানটাইমের সময় পরিবর্তন করতে ট্রিগার তৈরি করতে পারেন create