2009-03-02 34 views
3

私はobservableコレクションにバインドされた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に同様のControlTemplateを指定した)であります私はという1つのというユーザーコントロールのインスタンスしか取得できません。そこには、バインドされている各アイテムのインスタンスがあります。

+0

_「各アイテムのインスタンスが必要です」_ - ここで必要性を明確にしてください。 _Why_あなたは具体的に各項目のために新しいインスタンスを1つ持っていますか?具体的に言えば、問題を確実に再現する良い[mcve]を提供し、コードが何をしているのか、それがあなたがしたいこととどのように違うのかを正確に説明してください。 _(遅い時間にチンミングすることについて私の謝罪...私はこの質問(別のものに答える)(http://stackoverflow.com/q/33125188)を横断しただけで、これは私が他の1つで、私は明確化を求めるだろうと思った)_。 –

答えて

1

Xを設定してみてください:共有=「false」の場合

falseに設定すると、リソースに対する要求をするための新しいインスタンスを作成するようなWindowsのプレゼンテーション財団(WPF)リソース検索の動作を変更すべての要求に対して同じインスタンスを共有するのではなく、各要求を処理します。

+0

残念ながら、動作しません。私はcontentTemplateに設定しようとしましたが、運はありません。 (別のresourceDictionaryで定義されている場合でも)。そして、私はuserControlでそれを設定することも許可されていません... – Jowen

+0

この記事を読むジョシュ・スミス(http://joshsmithonwpf.wordpress.com/2009/01/27/my-mvvm-article-in-msdn-雑誌/)この記事では、彼はタブコントロール内の複数のビュー(usercontrols)をホストしています... – rudigrobler

+0

また、この記事(http://www.dev102.com/2009/03/02/tidy-up-your-xaml- and-code-behind-use-usercontrols-inside-templates /)今朝見つけた – rudigrobler

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> 
+0

私。ありがとう – zleao

-1

はあなたのPageViewModelクラスのEquals()メソッドをオーバーライドする必要があります。

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

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

このようなものが動作するはずです。

これで、Nameという名前の同じプロパティを探しています。それ以外の場合は、一意のIDプロパティを追加することもできます。

関連する問題