私は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を動作させるにはどうすればいいですか?
をそれは魔法だ、「第一の方法は、」この問題を解決しました!ありがとうございました! – sarh