2014-05-20 4 views
6

का उपयोग करते समय अतिरिक्त आइटम जोड़ें I प्रोजेक्ट में मेरे पास TabControl है जिसमें मैं ItemsSource के माध्यम से टैब की एक श्रृंखला प्रदर्शित करना चाहता हूं। मुझे TabControl की शुरुआत में कुछ "सिंहावलोकन" टैब भी होना चाहिए, जो ItemsSource में स्थित नहीं हो सकते हैं।आइटमसोर्स

सबसे अच्छा तरीका है इस लक्ष्य को हासिल करने के लिए क्या है, एक ही रास्ता मैं के बारे में सोच सकते हैं मेरी XAML में मेरी सिंहावलोकन टैब हैं और बस के बजाय ItemSource का उपयोग करने का मैन्युअल टैब आइटम जोड़ने के लिए कोड के माध्यम से है इस बारे में जाने के लिए सबसे अच्छा तरीका है यह।

उत्तर

8

आप CompositeCollection (MSDN) पूरा करने के लिए इस का उपयोग कर सकते हैं:

<Window.Resources> 
    <CollectionViewSource x:Key="ExistingTabs" Source="{Binding ExistingTabs}"/> 
</Window.Resources> 
<TabControl> 
    <TabControl.ItemsSource> 
     <CompositeCollection> 
      <TabItem>SpecialItem</TabItem> 
      <CollectionContainer Collection="{Binding Source={StaticResource ExistingTabs}}"/> 
     </CompositeCollection> 
    </TabControl.ItemsSource> 
</TabControl> 
-2

दुर्भाग्यवश आप स्पष्ट रूप से जोड़े गए आइटम संग्रह ऑब्जेक्ट्स के साथ आइटम्ससोर्स बाध्यकारी मिश्रण नहीं कर सकते हैं। तो आपके पास दो विकल्प हैं, या तो निश्चित आइटम जोड़ें और फिर अपनी बाध्य सूची से मैन्युअल रूप से आइटम्स संग्रह या आइटम्ससोर्स को उस संग्रह में बाध्य करें जिसमें निश्चित ऑब्जेक्ट्स और आपके बाध्य संग्रह के दोनों आइटम शामिल हैं। किसी भी मामले में सबसे बड़ा मुद्दा संभवतः अद्यतन करने के साथ होता है जब आपका डेटा बदलता है- सुनिश्चित करें कि सही आइटम हटा दिए गए/जोड़े गए और यूआई सही तरीके से अपडेट हो जाएं।

+1

-1 यह सच नहीं है। एक 'कंपोजिट कोलेक्शन' है जिसका उपयोग डाटाबाउंड कलेक्शन स्रोतों और मनमाने ढंग से एक्सएएमएल-परिभाषित तत्वों को जोड़ने के लिए किया जा सकता है। –

+0

इसे एक उत्तर के रूप में प्रदान करने के लिए देखभाल? – Hugoagogo

0

आप CompositeCollection उपयोग कर सकते हैं How do you add a generic item to a ComboBox bound to a collection in WPF

<TabControl> 
     <TabControl.ItemsSource> 
      <CompositeCollection> 
       <TabItem Header="extra tab item"> //Not bound 
        <TextBox>something</TextBox> 
       </TabItem> 
       <CollectionContainer x:Name="cc"/> 
      </CompositeCollection> 
     </TabControl.ItemsSource> 
    </TabControl> 

पीछे कोड:

cc.Collection=yourObservableCollection 
2

किसी के लिए रास्ता खोजने यूएसआई का CollectionContainer साथ एनजी HeaderTemplate/ContentTemplate:

पहले ViewModel में टाइप करें प्रॉपर्टी जोड़ें

public Type Type { get { return this.GetType(); } } 

उपयोग प्रकार संपत्ति

<Window x:Class="TabDemo.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:TabDemo" 
     xmlns:vm="clr-namespace:TabDemo.ViewModel" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525" 
     d:DataContext="{d:DesignInstance vm:TabViewModel}"> 
    <Window.Resources> 
     <CollectionViewSource x:Key="ExistingTabs" Source="{Binding ExistingTabs}"/> 
     <DataTemplate x:Key="TemplateForTheHeader" DataType="{x:Type vm:TabViewModel}"> 
      <TextBlock Text="{Binding Title}"/> 
     </DataTemplate> 
     <DataTemplate x:Key="TemplateForTheContent" DataType="{x:Type vm:TabViewModel}"> 
      <DockPanel> 
       <DataGrid ItemsSource="{Binding Data}"></DataGrid> 
      </DockPanel> 
     </DataTemplate> 
     <Style x:Key="TabItemStyle" TargetType="TabItem"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=Type}" Value="{x:Type vm:TabViewModel}"> 
        <Setter Property="HeaderTemplate" Value="{StaticResource TemplateForTheHeader}" /> 
        <Setter Property="ContentTemplate" Value="{StaticResource TemplateForTheContent}" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Window.Resources> 
    <Grid> 
     <TabControl Grid.Row="1" ItemContainerStyle="{StaticResource TabItemStyle}"> 
      <TabControl.ItemsSource> 
       <CompositeCollection> 
        <TabItem Header="Fixed Header"> 
         <TabItem.Content> 
          <TextBlock Text="Fixed Content"/> 
         </TabItem.Content> 
        </TabItem> 
        <CollectionContainer Collection="{Binding Source={StaticResource ExistingTabs}}"/> 
       </CompositeCollection> 
      </TabControl.ItemsSource> 
     </TabControl> 
    </Grid> 
</Window> 
से पहचान गतिशील टैब के लिए HeaderTemplate/ContentTemplate स्थापित करने के लिए Style.Triggers

संदर्भ Anderson Imes का उत्तर: https://stackoverflow.com/a/1348369/1196637

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