datatemplate - 在tabControl中,wpf多个userControl实例

  显示原文与译文双语对照的内容
67 1

我有一个 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;
 }
}

所以这个场景中的问题是,对于用户控件,我只获得了一个实例,其中我希望每个项目都有一个实例被绑定到这个实例。

时间:原作者:0个回答

113 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>
原作者:
63 1

尝试设置

x: shared="false"

当设置为 false 时,修改 Windows Presentation Foundation ( WPF ) 资源检索行为,这样可以为每个请求创建一个新实例,而不是为所有请求共享相同的实例。

原作者:
85 5

你需要重写 PageViewModel 类的Equals() 方法。

public override bool Equals(object obj)
{
 if (!(obj is PageViewModel)) return false;
 return (obj as PageViewModel).Name == this.Name;
}

像这样的东西应该能工作。

现在它正在查找值名称的相同属性。另外,还可以添加唯一的ID属性。

原作者:
...