我从一些示例代码开始来说明我的问题。但我对此很新,所以我可能会错过一些基本的东西。但是这个例子非常接近我想做的事情。
XAML(主窗口):
<StackPanel>
<Button Click="ButtonRemove_Click">Remove</Button>
<Button Click="ButtonAdd_Click">Add</Button>
<TabControl Name="TabFilter" ItemsSource="{Binding Tabs}">
<TabControl.ContentTemplate>
<DataTemplate>
<ScrollViewer VerticalScrollBarVisibility="Auto">
<ItemsControl ItemsSource="{Binding Path=TextList}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Text}"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
</StackPanel>
C#代码:
public class TestText : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public string Text
{
get
{
return _Text;
}
set
{
_Text = value;
NotifyPropertyChanged();
}
}
private string _Text;
public TestText(string text)
{
Text = text;
}
}
public class Tabs : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public ObservableCollection<TestText> TextList { get; set; }
public Tabs(ObservableCollection<TestText> list)
{
this.TextList = list;
if (TextList.Count == 0)
TextList.Add(new TestText("Testing"));
}
}
public partial class MainWindow : Window
{
public ObservableCollection<TestText> TextList { get; set; }
public ObservableCollection<Tabs> Tabs { get; set; }
public MainWindow()
{
TextList = new ObservableCollection<TestText>();
Tabs = new ObservableCollection<Tabs>();
Tabs.Add(new Tabs(TextList));
InitializeComponent();
}
private void ButtonAdd_Click(object sender, RoutedEventArgs e)
{
Tabs.Add(new Tabs(TextList));
}
private void ButtonRemove_Click(object sender, RoutedEventArgs e)
{
Tabs.RemoveAt(0);
}
}
当我启动程序时,我得到一个包含&#34; Testing&#34;的选项卡。然后单击“删除”以删除选项卡。当我单击添加时,会创建一个新选项卡。 这是我的问题。由于集合未更改,我希望或希望新创建的选项卡反映集合中的内容。它应该是一个包含内容&#34; Testing&#34;的选项卡,但该选项卡为空。
我做错了什么?
答案 0 :(得分:0)
它应该是内容为“Testing”的标签,但标签为空。
您看到的不是标签为空,而是没有选择标签。由于您删除了所有现有选项卡,因此没有剩余选项卡可以保留选择。因此,当再次更改基础集合以添加另一个选项卡时,不会自动选择该选项卡。如果单击选项卡以选择它,则内容仍然存在。实际上,您可以通过选项卡标题未选中时的方式查看此内容。
请注意,您的Tabs
个实例共享您在TestText
中创建的单个MainWindow
列表。因此,当您更改任何选项卡中的内容时,您将自动更改所有选项卡中的内容,或将来会存在,因为所有实例始终都会传递相同的ObservableList实例。