如果您在DataTemplate中放置控件,为什么它们的单独状态会被复制或反映在TabControl的每个选项卡中?您在一个选项卡中进行更改,所有其他选项卡都会反映,为什么会这样?!对我而言,TabControl只初始化一个模板化的ContentControl,每次单击选项卡时都会将整个内容复制一遍 - 保留旧的控件状态不变。要查看我的意思,请在您的XAML-Pad中放置以下代码:
它将创建一个带有两个模板标签的TabControl。现在在TextBox中输入一些内容并切换到另一个选项卡,输入的文本将被保留。每个选项卡现在都将具有相同的内容。我没有观察到ListBox或任何其他控件中的相同行为,这使得实际工作非常困难,因为每一点都需要绑定到ViewModel才能在TabControl中使用。当我在DataTemplate中使用Expanders时,我注意到了这种奇怪的行为,它会在所有选项卡中弹出,尽管我明确地指出了一个。为了解决这个问题,我不得不将“IsExpanded”绑定到ViewModel中的属性,但这真的很糟糕。
有人知道这里发生了什么吗?
解决方案
<TabControl>
<TabControl.ContentTemplate>
<DataTemplate>
<Border>
<TextBox Text="test"/>
</Border>
</DataTemplate>
</TabControl.ContentTemplate>
<TabItem Header="Tab1"/>
<TabItem Header="Tab2"/>
</TabControl>
它将创建一个带有两个模板标签的TabControl。现在在TextBox中输入一些内容并切换到另一个选项卡,输入的文本将被保留。每个选项卡现在都将具有相同的内容。我没有观察到ListBox或任何其他控件中的相同行为,这使得实际工作非常困难,因为每一点都需要绑定到ViewModel才能在TabControl中使用。当我在DataTemplate中使用Expanders时,我注意到了这种奇怪的行为,它会在所有选项卡中弹出,尽管我明确地指出了一个。为了解决这个问题,我不得不将“IsExpanded”绑定到ViewModel中的属性,但这真的很糟糕。
有人知道这里发生了什么吗?
解决方案
<TabControl x:Name="MainTab" SelectedIndex="0"/>
...
Collection.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(Collection_CollectionChanged);
...
void Collection_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
TabItem MyNewItem = new TabItem();
ContentPresenter MyContentPresenter = new ContentPresenter();
MyContentPresenter.ContentTemplate = (DataTemplate)this.FindResource("MyTemplate");
MyContentPresenter.Content = e.NewItems[0];
MyNewItem.Content = MyContentPresenter;
MainTab.Items.Add(MyNewItem );
}
}