我有一个tabControl,它绑定到一个可观察的集合。 在headerTemplate中,我想绑定到一个字符串属性,并在contentTemplate中放置了一个用户控件。
以下是MainWindow.xaml的代码:
<Grid>
<Grid.Resources>
<DataTemplate x:Key="contentTemplate">
<local:UserControl1 />
</DataTemplate>
<DataTemplate x:Key="itemTemplate">
<Label Content="{Binding Path=Name}" />
</DataTemplate>
</Grid.Resources>
<TabControl IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding Path=Pages}"
ItemTemplate="{StaticResource itemTemplate}"
ContentTemplate="{StaticResource contentTemplate}"/>
</Grid>
其代码背后:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new MainWindowViewModel();
}
}
public class MainWindowViewModel
{
public ObservableCollection<PageViewModel> Pages { get; set; }
public MainWindowViewModel()
{
this.Pages = new ObservableCollection<PageViewModel>();
this.Pages.Add(new PageViewModel("first"));
this.Pages.Add(new PageViewModel("second"));
}
}
public class PageViewModel
{
public string Name { get; set; }
public PageViewModel(string name)
{
this.Name = name;
}
}
所以这个场景中的问题(指定了一个itemTemplate和一个controlTemplate)是我只得到用户控件的一个实例,我希望每个项目都有一个实例这是必然的。
答案 0 :(得分:2)
试试这个:
<TabControl IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Pages}">
<TabControl.Resources>
<DataTemplate x:Key="contentTemplate" x:Shared="False">
<local:UserControl1/>
</DataTemplate>
<Style TargetType="{x:Type TabItem}">
<Setter Property="Header" Value="{Binding Name}"/>
<Setter Property="ContentTemplate" Value="{StaticResource contentTemplate}"/>
</Style>
</TabControl.Resources>
</TabControl>
答案 1 :(得分:1)
尝试设置
X:共享= “假”
设置为false时,修改Windows Presentation Foundation(WPF)资源检索行为,以便对资源的请求将为每个请求创建新实例,而不是为所有请求共享同一实例。
答案 2 :(得分:-1)
您需要覆盖Equals()
类的PageViewModel
方法。
public override bool Equals(object obj)
{
if (!(obj is PageViewModel)) return false;
return (obj as PageViewModel).Name == this.Name;
}
这样的事情应该有效。
现在它正在寻找值Name的相同属性。否则,您还可以添加唯一的ID属性。