2012-03-06 20 views
2

私はTabControlでWPFアプリケーションをやっています。初めに私はTabBaseタブのviewmodelの基本クラスですTabBase項目ののObservableCollectionにバインドされたタブコントロール、持っていた:TabControl ItemTemplate without ItemsSource

<TabControl 
    IsSynchronizedWithCurrentItem="True" 
    ItemsSource="{Binding Tabs}" 
    ItemTemplate="{StaticResource ClosableTabTemplate}" 
... 
public ObservableCollection<TabBase> Tabs { get; private set; } 
... 
public abstract class TabBase : ViewModelBase 
... 
public abstract class ViewModelBase : INotifyPropertyChanged 
{ 
    public virtual string DisplayName { get; protected set; } 
... 
<DataTemplate x:Key="ClosableTabTemplate"> 
    <DockPanel Width="120"> 
     <Button 
      Command="{Binding Path=CmdClose}" 
      Content="X" 
      /> 
     <ContentPresenter 
      Content="{Binding Path=DisplayName}"> 
     </ContentPresenter> 
    </DockPanel> 
</DataTemplate> 

をしかし、私は、タブを切り替えると、現在のタブがされているように見える問題に直面しました前に既に開いていたとしても、毎回作成されます。 StackOverflowを介して検索私はhereを参照して解決策hereを見つけました。私は宣言的なItemsSourceをコードからのタブの動的作成と置き換えました。タブの切り替えパフォーマンスの問題は解決されましたが、タブヘッダーがテンプレートへのリンクを失ってしまったため、キャプションと閉じるボタンが付いたタブヘッダーではなく、小さなタブヘッダーが表示されます。タブ作成コードで少し演奏すると、私はタブのサイズと閉じるボタンを復元することができましたが、バインディングなしで - キャプションがなく、閉じるボタンが機能しません(item.Headerが元のタブサイズを復元した5行):

private void AddTabItem(TabBase view) 
    { 
     TabItem item = new TabItem(); 
     item.DataContext = view; 
     item.Content = new ContentControl(); 
     (item.Content as ContentControl).Focusable = false; 
     (item.Content as ContentControl).SetBinding(ContentControl.ContentProperty, new Binding()); 

     item.Header = new ContentControl(); 
     (item.Header as ContentControl).DataContext = view; 
     (item.Header as ContentControl).Focusable = false; 
     (item.Header as ContentControl).SetBinding(ContentControl.ContentProperty, new Binding()); 
     item.HeaderTemplate = (DataTemplate)FindResource("ClosableTabTemplate"); 

     tabControl.Items.Add(item); 
    } 

質問は、ItemSourceバインディングなしでTabControlでItemTemplateを動作させるにはどうすればいいですか?

答えて

2

明示的にitem.HeaderをContentControlに設定すると、HeaderTemplateはそのオブジェクトをDataContextとして使用しています。通常、HeaderプロパティはViewModelを取得し、ContentPresenterはその(非ビジュアル)オブジェクトを取得し、HeaderTemplateを適用します。 ViewModelを階層内のレベルまで押し下げて、テンプレートがデータと同じ場所に適用されないようにしました。 1はバインディングの問題を修正するが、1つまたはその他の状況に良い仕事かもしれなければならないのいずれかの移動:

item.Header = view; 

または

(item.Header as ContentControl).ContentTemplate = (DataTemplate)FindResource("ClosableTabTemplate"); 
+0

をそれは魔法だ、「第一の方法は、」この問題を解決しました!ありがとうございました! – sarh

関連する問題