2017-11-30 2 views
0

Ich habe dieses XAML:WPF binden Combobox.ItemsSource in einem TabControl.ContentTemplate

<TabControl ItemsSource="{Binding Items}"> 
    <TabControl.ContentTemplate> 
    <DataTemplate> 
     <ComboBox ItemsSource="{Binding Foo}"/> 
    </DataTemplate> 
    </TabControl.ContentTemplate> 
</TabControl> 

Ich möchte Items binden, die eine benutzerdefinierte TabItem Klasse ist, insbesondere:

public class CustomItem : TabItem 
{ 
    public ObservableCollection<string> Foo { get; set; } 
} 

in MainWindow.cs ich habe Items definiert:

public ObservableCollection<CustomItem> Items {get; set;} = new ObservableCollection<CustomItem>{new CustomItem{Foo = new ObservableCollection<string>{"foo1", "foo2"} } }; 

ich möchte popul aß die oben definierte Combobox mit den Foo-Elementen, also würde ich gerne "foo1" und "foo2" sehen. Eigentlich kann ich nichts sehen: Ich denke, es ist ein DataContext Problem ist, so dass ich versuche, mit dem folgenden Code, aber nichts passiert:

<ComboBox d:DataContext="{d:DesignInstance local:CustomItem}" ItemsSource="{Binding Foo}/>" 

Wie kann ich mein Problem beheben?

Antwort

1

Ihr XAML ist ziemlich gut, aber Sie sollten CustomItem von TabItem nicht ableiten. Das verursacht die TabControl, um es sehr unterschiedlich zu behandeln, und das ist nicht nötig.

Stattdessen sollten Sie es von einer Viewmodel-Basisklasse ableiten, die INotifyPropertyChanged implementiert, und seine Eigenschaften sollten PropertyChanged erhöhen, wenn sie ihre Werte ändern. Sie können viele Beispiele dafür finden, wie Sie das direkt hier auf Stack Overflow tun können. Aber jetzt, hier sind einige schnelle Änderungen an Ihrem Code, werden Sie sich zu bewegen:

public class CustomItem 
{ 
    public String Title { get; set; } 
    public ObservableCollection<string> Foo { get; set; } = new ObservableCollection<string>(); 

    public String SelectedFoo { get; set; } 
} 

XAML

<TabControl ItemsSource="{Binding Items}"> 
    <TabControl.ItemContainerStyle> 
     <Style TargetType="TabItem"> 
      <Setter Property="Header" Value="{Binding Title}" /> 
     </Style> 
    </TabControl.ItemContainerStyle> 
    <TabControl.ContentTemplate> 
     <DataTemplate> 
      <ComboBox ItemsSource="{Binding Foo}" SelectedItem="{Binding SelectedFoo}" /> 
     </DataTemplate> 
    </TabControl.ContentTemplate> 
</TabControl>