2009-03-02 28 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屬性。