我有这个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}/>"
我怎样才能解决问题?
答案 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>