2014-10-19 1478 views
0

我从一些示例代码开始说明我的问题。但我是新来的,所以它可能是我错过了一些基本的东西。但是这个例子非常接近我想要做的事情。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); 
    } 
} 

当我启动程序我得到含有 “测试” 一个标签。然后,我单击删除删除选项卡。当我点击添加一个新的标签被创建。 这是我的问题。由于集合没有改变,我期望或想要的是,新创建的选项卡反映集合中的内容。它应该是内容为“测试”的选项卡,但该选项卡为空。

我在做什么错了?

回答

0

它应该是内容为“测试”的选项卡,但选项卡为空。

你所看到的不是标签是空的,而是没有选中标签。由于您删除了所有现有标签,因此没有其他标签可以保留选择。因此,当底层集合再次更改为添加另一个选项卡时,该选项卡不会自动选择。如果你点击标签来选择它,内容仍然存在。您可以通过选项卡标题看起来没有被选中时的样子来看到。

此外请注意,您所有的Tabs实例共享您在MainWindow中创建的单个TestText列表。因此,当您更改任意选项卡中的内容时,您将自动更改所有存在或将来存在的选项卡中的内容,因为所有实例始终都会传递相同的ObservableList实例。

+0

谢谢,但现在我觉得很愚蠢=)我试图举出一个例子来说明我的真实问题,然后错过了关于所选标签的简单事情。但它回答了这个问题。共享列表也仅仅是一个例子,我不打算为几个标签使用相同的列表。 – raptorjr 2014-10-20 14:12:09