2009-03-02 62 views
3

我有一个绑定到可观察集合的tabControl。 在headerTemplate中,我想绑定到一个字符串属性,并在contentTemplate中放置了一个用户控件。tabControl中的多个userControl实例

下面是该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和一个控件模板)在这种情况下的问题是我只得到一个实例为用户控制,我想要为每个绑定到的项目实例。

+0

_“我想为每件物品提供实例”_ - 请在此澄清您的需求。为什么你为每个项目专门设立一个新实例?请具体说明一下:提供一个很好的[mcve],可以可靠地再现您的问题,并准确解释代码的作用以及与您希望执行的操作有何不同。 _(我很抱歉迟到... ...我只是跑过这个问题[回答不同的](http://stackoverflow.com/q/33125188);这可能是也可能不是我在另一个,所以我想我会要求澄清)。 – 2016-02-26 22:49:17

回答

1

尝试设置

X:共享= “假”

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

+0

不幸的是,它不起作用。我试图在contentTemplate上设置它,但没有运气。 (甚至没有在单独的resourceDictionary中定义它时)。我甚至不允许在userControl上设置它... – Jowen 2009-03-02 12:32:05

+0

阅读Josh Smith的这篇文章(http://joshsmithonwpf.wordpress.com/2009/01/27/my-mvvm-article-in-msdn-杂志/)在这篇文章中他主持了多个视图(usercontrols)在一个tabcontrol ... – rudigrobler 2009-03-04 06:34:16

1

试试这个:

<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

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

public override bool Equals(object obj) 
{ 
    if (!(obj is PageViewModel)) return false; 

    return (obj as PageViewModel).Name == this.Name; 
} 

像这样的东西应该工作。

现在它正在寻找值名称相同的属性。否则,您也可以添加一个唯一的ID属性。