WPF在TabControl.ContentTemplate中绑定Combobox.ItemsSource

时间:2017-11-30 17:15:01

标签: c# wpf xaml data-binding combobox

我有这个XAML:

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

我想绑定Items这是一个自定义TabItem类,特别是:

public class CustomItem : TabItem
{
    public ObservableCollection<string> Foo { get; set; }
}
MainWindow.cs中的

我定义了Items

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

我想用Foo元素填充上面定义的组合框,所以我想看看“foo1”和“foo2”。 实际上我什么也看不见:我认为这是一个DataContext问题,所以我尝试使用以下代码,但没有任何反应:

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

我怎样才能解决问题?

1 个答案:

答案 0 :(得分:1)

您的XAML非常好,但您不应该从CustomItem派生TabItem。这导致TabControl以非常不同的方式对待它,并且没有必要这样做。

相反,您应该从实现INotifyPropertyChanged的viewmodel基类派生它,并且当它们更改其值时,其属性应该引发PropertyChanged。您可以在Stack Overflow上轻松找到有关如何执行此操作的许多示例。但是现在,这里有一些代码的快速更改,可以让您感动:

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>