2010-08-20 12 views
10

मुझे लगता है कि मेरे पास एक बहुत ही सरल लक्ष्य है लेकिन ऐसा नहीं लगता है।स्थिर शीर्षलेख के साथ आइटम नियंत्रण

मैं जो हासिल करना चाहता हूं वह एक हैडर के साथ एक आइटम नियंत्रण (क्योंकि मैं सूची की चयन कार्यक्षमता नहीं चाहता) है। अधिमानतः एक स्थिर शीर्षलेख।

वर्तमान में मैं शीर्षलेख के लिए एक ग्रिड का उपयोग कर रहा हूं और फिर उस ग्रिड को आइटम्स कंट्रोल के आइटम टेम्पलेट (डेटा टेम्पल) में कॉपी कर रहा हूं और फिर उन्हें एक ग्रिड में दूसरे से ऊपर रख रहा हूं। यह थोड़े काम करता है लेकिन यह हमेशा अच्छी तरह से लाइन नहीं करता है।

मुझे तब हेड्रेड इटम्स कंट्रोल मिला जो मैंने सोचा था कि एक शानदार विचार था लेकिन इसे काम करने में नहीं मिला, यह सिर्फ हेडर नहीं दिखाता है। मैंने निम्नलिखित की कोशिश की है;

  • बस ItemsControl.Header टैग
  • HeaderTemplate (DataTemplate) के भीतर ग्रिड रखने के भीतर स्थिर पाठ के साथ TextBlocks के साथ एक ग्रिड रखने Xaml
  • की "हैडर" में पाठ दर्ज करने के लिए और यह बाध्यकारी एक साधारण वस्तु

मैं इसे उत्पादन ऐप में ले जाने से पहले एक छोटी परियोजना में मिश्रण में कर रहा हूं और मैं बस एक साधारण नमूना डेटा स्रोत का उपयोग कर रहा हूं जिसे मैंने बनाया है।

मुझे नाव पूरी तरह से गायब हो सकता है लेकिन किसी भी मदद की सराहना की जाएगी।

मेरे वर्तमान कोड इस प्रकार है, पहले मेरी HeaderedItemsControl

<HeaderedItemsControl Header="HeaderedItemsControl" 
     ItemsSource="{Binding Collection, Mode=Default}" 
     ItemTemplate="{DynamicResource ItemsControlDataTemplate}" 
     HeaderTemplate="{DynamicResource ItemsControlHeaderDataTemplate}"/> 

तो मैं एक ItemTemple जो

<DataTemplate x:Key="ItemsControlDataTemplate"> 
     <Grid d:DesignWidth="268"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="0.754*"/> 
       <ColumnDefinition Width="0.246*"/> 
      </Grid.ColumnDefinitions> 
      <TextBlock Text="{Binding Property1, Mode=Default}" TextWrapping="Wrap" d:LayoutOverrides="Height" HorizontalAlignment="Stretch" Margin="0" /> 
      <TextBlock Text="{Binding Property2, Mode=Default}" TextWrapping="Wrap" d:LayoutOverrides="Height" Grid.Column="1" HorizontalAlignment="Left" Margin="0" /> 
     </Grid> 
    </DataTemplate> 

की उम्मीद है और फिर शीर्ष लेख जो बेखटके अपने काम का विरोध कर रहा है के रूप में काम करता है मिल गया है है नैतिक, मैंने इसे बाध्यकारी और टेक्स्टब्लॉक में केवल सादा पाठ के साथ करने की कोशिश की है। आगे की संपत्ति

<DataTemplate x:Key="ItemsControlHeaderDataTemplate"> 
     <Grid d:DesignWidth="268"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="0.754*"/> 
       <ColumnDefinition Width="0.246*"/> 
      </Grid.ColumnDefinitions> 
      <TextBlock Text="{Binding Header.Header1, Mode=Default, Source={StaticResource SampleDataSource6}}" TextWrapping="Wrap" HorizontalAlignment="Stretch" Margin="0"/> 
      <TextBlock Text="{Binding Header.Header2, Mode=Default, Source={StaticResource SampleDataSource6}}" TextWrapping="Wrap" d:LayoutOverrides="Height" Grid.Column="1" HorizontalAlignment="Left" Margin="0"/> 
     </Grid> 
    </DataTemplate> 

उत्तर

9

HeaderedItemsControl एक डिफ़ॉल्ट शैली नहीं है, तो यह सिर्फ आधार ItemsControl वर्ग, जो किसी भी हैडर से प्रस्तुत नहीं होती से टेम्पलेट का उपयोग कर रहा है। इसका उपयोग केवल फ्रेमवर्क द्वारा मेनूइटम, टूलबार और ट्री व्यूइटम के लिए बेस क्लास के रूप में किया जाता है, जो अपने स्वयं के टेम्पलेट को परिभाषित करता है। आपको लगता है कि शीर्ष लेख के लिए एक ContentPresenter शामिल अपने स्वयं के टेम्पलेट बना सकते हैं:

<HeaderedItemsControl ItemsSource="{Binding}" Header="Some text"> 
    <HeaderedItemsControl.Template> 
     <ControlTemplate TargetType="HeaderedItemsControl"> 
      <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true"> 
       <DockPanel> 
        <ContentPresenter DockPanel.Dock="Top" ContentSource="Header" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
        <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
       </DockPanel> 
      </Border> 
     </ControlTemplate> 
    </HeaderedItemsControl.Template> 
</HeaderedItemsControl> 

आप केवल एक ही स्थान पर यह प्रयोग कर रहे हैं, यह एक सादा ItemsControl उपयोग में आसान हो सकता है और नियंत्रण टेम्पलेट में सीधे अपने हैडर शामिल हो सकता है ।

इसके अलावा, ऐसा लगता है कि आप दो ग्रिड रखने की कोशिश कर रहे हैं जिनके स्तंभों की समान चौड़ाई है। आप Grid Size Sharing in WPF पर देखना चाह सकते हैं। यदि आप अभिभावक नियंत्रण पर ग्रिड। ISharedSizeScope सेट करते हैं तो आप उन्हें समान चौड़ाई देने के लिए विभिन्न ग्रिड के कॉलम पर SharedSizeGroup सेट कर सकते हैं।

+0

धन्यवाद सर, आपका जवाब वास्तव में मदद करता है। अंत में मैंने HeaderedItemsControl के लिए एक शैली बनाई और ContentSourceer को जोड़ा क्योंकि आपने ContentSource = हेडर विशेषता के साथ सुझाव दिया था। इस तरह से मैं ऐप के भीतर सभी आइटम्स कंट्रोल पर इसका उपयोग कर सकता हूं और केवल HeaderedItemsControl.Header टैग में टेक्स्टब्लॉक के साथ ग्रिड जोड़ सकता हूं। ग्रिड आकार साझाकरण पर आपके सुझाव को wrt, मैं इसका परीक्षण करूंगा लेकिन यह सुनिश्चित नहीं करेगा कि यह एक ग्रिड के रूप में काम करेगा, डेटा टेम्पलेट में है और दूसरा आइटम नियंत्रण के शीर्षलेख में होगा लेकिन मैं इसका परीक्षण करूंगा और प्रतिक्रिया दूंगा –

0

कल समान कुछ ऐसा हुआ - HeaderedContentControl के लिए, हेडर सेट करने का प्रयास करें, हेडर टेम्पलेट संपत्ति नहीं।

मुझे हेडर टेम्पलेट के माध्यम से काम करने के लिए बाइंडिंग प्राप्त करना असंभव लगता है - सामग्री सही ढंग से बाध्यकारी थी। अगर कोई तर्क बताता है तो मुझे बहुत दिलचस्पी होगी।

आशा है कि उपर्युक्त मेरा कामकाज मदद करता है।

क्रिस

संबंधित मुद्दे