WPF:更新/刷新/重新绑定ItemSsource?

时间:2014-10-19 21:15:56

标签: c# wpf

我从一些示例代码开始来说明我的问题。但我对此很新,所以我可能会错过一些基本的东西。但是这个例子非常接近我想做的事情。

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;的选项卡,但该选项卡为空。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

  

它应该是内容为“Testing”的标签,但标签为空。

您看到的不是标签为空,而是没有选择标签。由于您删除了所有现有选项卡,因此没有剩余选项卡可以保留选择。因此,当再次更改基础集合以添加另一个选项卡时,不会自动选择该选项卡。如果单击选项卡以选择它,则内容仍然存在。实际上,您可以通过选项卡标题未选中时的方式查看此内容。

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