WPF:更新/刷新/重新绑定ItemSource?
问题描述:
我从一些示例代码开始说明我的问题。但我是新来的,所以它可能是我错过了一些基本的东西。但是这个例子非常接近我想要做的事情。WPF:更新/刷新/重新绑定ItemSource?
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);
}
}
当我启动程序我得到含有 “测试” 一个标签。然后,我单击删除删除选项卡。当我点击添加一个新的标签被创建。 这是我的问题。由于集合没有改变,我期望或想要的是,新创建的选项卡反映集合中的内容。它应该是内容为“测试”的选项卡,但该选项卡为空。
我在做什么错了?
答
它应该是内容为“测试”的选项卡,但选项卡为空。
你所看到的不是标签是空的,而是没有选中标签。由于您删除了所有现有标签,因此没有其他标签可以保留选择。因此,当底层集合再次更改为添加另一个选项卡时,该选项卡不会自动选择。如果你点击标签来选择它,内容仍然存在。您可以通过选项卡标题看起来没有被选中时的样子来看到。
此外请注意,您所有的Tabs
实例共享您在MainWindow
中创建的单个TestText
列表。因此,当您更改任意选项卡中的内容时,您将自动更改所有存在或将来存在的选项卡中的内容,因为所有实例始终都会传递相同的ObservableList实例。
谢谢,但现在我觉得很愚蠢=)我试图举出一个例子来说明我的真实问题,然后错过了关于所选标签的简单事情。但它回答了这个问题。共享列表也仅仅是一个例子,我不打算为几个标签使用相同的列表。 – raptorjr 2014-10-20 14:12:09