2009-07-15 22 views
5

मैं code of MSDN के साथ एमवीवीसी की अपनी समझ जारी रखता हूं और मेरे पास एक प्रश्न है।डब्ल्यूपीएफ डेटा टेम्पलेट और बाइंडिंग

.xaml में उनके पास स्क्रीन पर प्रदर्शित आदेशों की एक सूची है।

<Border 
    Grid.Column="0" 
    Style="{StaticResource MainBorderStyle}" 
    Width="170" 
    > 
    <HeaderedContentControl 
     Content="{Binding Path=Commands}" 
     ContentTemplate="{StaticResource CommandsTemplate}" 
     Header="Control Panel" 
     Style="{StaticResource MainHCCStyle}" 
     /> 
    </Border> 

यहाँ से, मैं समझता हूँ कि DataContext सेट किया गया है (यहाँ नहीं दिखाया गया है) और यह आदेश के संग्रह को प्रदर्शित करेगा। जो मुझे समझ में नहीं आता है वह कमांड टेम्पलेट है जिसे आप नीचे देख सकते हैं:

<DataTemplate x:Key="CommandsTemplate"> 
<ItemsControl IsTabStop="False" ItemsSource="{Binding}" Margin="6,2"> 
    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <TextBlock Margin="2,6">pou 
     <Hyperlink Command="{Binding Path=Command}"> 
      <TextBlock Text="{Binding Path=DisplayName}" /> 
     </Hyperlink> 
     </TextBlock> 
    </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
</DataTemplate> 

बाध्यकारी कैसे बनाया जाता है? यह कोड संग्रह के अंदर ऑब्जेक्ट से कमांड और DisplayName संपत्ति को जांचने के लिए कैसे कहता है? क्या यह आइटमसोर्स से है? यदि हां, तो मुझे समझ में नहीं आता कि यह केवल {बाध्यकारी} क्यों है। कोई भी मुझे समझा सकता है कृपया ContentTemplate से डेटा टेम्पलेट बाध्यकारी कार्य कैसे करें?

उत्तर

8

जैसा कि आपने कहा था, डेटाकॉन्टेक्स्ट व्यूमोडेल क्लास पर सेट है, इसलिए XAML में आपके द्वारा उल्लिखित नियंत्रण उस व्यूमोडेल के सार्वजनिक गुणों तक पहुंच पाएगा।

उदाहरण के लिए:

private ObservableCollection<Commander> commands = new ObservableCollection<Commander>(); 

    public ObservableCollection<Commander> Commands { 
     get { return commands; } 
     set { commands = value; } 
    } 

कमांडर वर्ग की संरचना।

public class Commander { 
    public ICommand Command { get; set; } 
    public string DisplayName { get; set; } 
} 

उस वीएम में कमांड नामक संपत्ति है जो पर्यवेक्षण योग्य हो सकती है। यह संपत्ति एक्सएएमएल से पहुंचा जा सकता है।

आप कल्पना कर सकते हैं कि हेड्रेडकंटेंट कंट्रोल एक कंटेनर है। HeaderedContentControl की सामग्री एक डेटा टेम्पलेट "कमांड टेम्पलेट" है जिसमें आइटम नियंत्रण है और यह वीएम की कमांड प्रॉपर्टी से जुड़ा हुआ है।

सामग्री = "{बाइंडिंग पथ = कमांड}"

और फिर, आप ItemControl कमांड के साथ फिर से बाध्य करने के लिए कर सकते हैं लेकिन यह है कि ItemControl सामग्री है कि आदेश के लिए बाध्य के अंदर है। तो आपको पथ को फिर से निर्दिष्ट करने की आवश्यकता नहीं है। तुम बस का उपयोग कर सकते हैं ताकि वे आदेश ObservableCollection के कमांडर वर्ग के रूप में एक ही स्तर पर कर रहे हैं

ItemsSource="{Binding}" instead of ItemsSource="{Binding Commands}". 

दो textblocks ItemControl के अंदर हैं। यही कारण है कि आप सीधे पाठ = "{बाध्यकारी पथ = DisplayName}" तक पहुंच सकते हैं।

उम्मीद है कि यह मदद करता है।

1

आइटम्ससोर्स बाइंडिंग {बाइंडिंग} को सीधे आइटम्सकंट्रोल के डेटाकॉन्टेक्स्ट से जोड़ता है (जो तब तक चेन को देखेगा जब तक यह सेट डेटा कॉन्टेक्स्ट नहीं पाता)। इस मामले में इसे HeaderedContentControl

आइटम नियंत्रण के अंदर प्रत्येक आइटम को इसके डेटाकॉन्टेक्स्ट को सूची में किसी तत्व पर सेट किया जाएगा।

<ItemsControl.ItemTemplate> सूची के अंदर प्रत्येक आइटम के लिए टेम्पलेट सेट कर रहा है, आइटम आइटम के लिए नहीं। तो {Binding Path=Command} और {Binding Path=DisplayName} सूची के अंदर तत्वों पर उन गुणों को देखेंगे।

+0

यदि यह DataContext करने के लिए सीधे बांधता यह सूची के संदर्भ और नहीं तत्व से आबद्ध किया जाना चाहिए सूची का? –

+0

यह आइटम नियंत्रण के लिए सच है, लेकिन आइटम्स कंट्रोल में प्रत्येक ** आइटम ** के डेटाकॉन्टेक्स्ट के लिए सूची का एक तत्व होगा। – Ray

+0

ठीक है, इसलिए {बाइंडिंग} का उपयोग करके इस संग्रह के अंदर डेटा कॉन्टेक्स्ट सही होगा? –

1

उदाहरण:

XAML

<Window x:Class="WpfApplication2.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300" Loaded="Window_Loaded"> 
    <Window.Resources> 
     <DataTemplate x:Key="CommandsTemplate"> 
      <ItemsControl IsTabStop="False" ItemsSource="{Binding}" Margin="6,2"> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <TextBlock Margin="2,6">pou 
          <Hyperlink Command="{Binding Path=Command}"> 
           <TextBlock Text="{Binding Path=DisplayName}" /> 
          </Hyperlink> 
         </TextBlock> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
      </ItemsControl> 
     </DataTemplate> 
    </Window.Resources> 
    <Grid> 
     <Border Width="170"> 
      <HeaderedContentControl 
       Content="{Binding Path=Commands}" 
       ContentTemplate="{StaticResource CommandsTemplate}" 
       Header="Control Panel"/> 
     </Border> 
    </Grid> 
</Window> 

सी #

/// <summary> 
/// Interaction logic for Window1.xaml 
/// </summary> 
public partial class Window1 : Window { 
    public Window1() { 
     InitializeComponent(); 

     Commands.Add(new Commander() { DisplayName = "DN1" }); 
     Commands.Add(new Commander() { DisplayName = "DN2" }); 
     Commands.Add(new Commander() { DisplayName = "DN3" }); 

     this.DataContext = this; 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) { 

    } 

    private ObservableCollection<Commander> commands = new ObservableCollection<Commander>(); 

    public ObservableCollection<Commander> Commands { 
     get { return commands; } 
     set { commands = value; } 
    } 
} 

public class Commander { 
    public ICommand Command { get; set; } 
    public string DisplayName { get; set; } 
} 
संबंधित मुद्दे