TabItem奇怪的行为,多个tabitems共享内容

时间:2014-07-05 04:44:57

标签: c# .net wpf mvvm tabs

任何标签中的更改都会更改其他标签!!!!!!!

代码说明:

===================

tabcontol项目源绑定到长度/计数为3的字符串集合。因此创建了3个tabitems。但他们表现得像一个人。您输入任何tabitem,它将反映在其他两个tabitems中。

下面是一个简单的xaml和代码背后。

<Window x:Class="TabAnalyzer.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TabControl ItemsSource="{Binding}">
            <TabControl.ContentTemplate>
                <DataTemplate>
                    <TextBox Height="30" Width="200"/>
                </DataTemplate>
            </TabControl.ContentTemplate>
        </TabControl>
    </Grid>
</Window>

=============================================== ====================

using System.Collections.ObjectModel;
using System.Windows;

namespace TabAnalyzer
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new StringCol().strdata;
        }
    }

    public class StringCol
    {
        public ObservableCollection<string> strdata
        {
            get;
            set;
        }

        public StringCol()
        {
            strdata = new ObservableCollection<string>();
            strdata.Add("hkhdfkshdfk");
            strdata.Add("hkhdfkshdfk");
            strdata.Add("hkhdfkshdfk");
        }
    }
}

以下是描述了奇怪行为的图像

Change in any tab affects the other

有谁可以请这个为什么会发生这种情况以及如何解决这个问题?

  • 如有任何其他信息,请添加评论。

注意:我使用的是VS 2013

提前致谢!

1 个答案:

答案 0 :(得分:1)

在WPF中,如果模板确实发生更改,则不会重建UI布局/控件。正常行为是保留模板并仅更新数据。

在这种情况下,数据不会绑定到任何内容,因此数据所有者就是UI本身。由于UI未重建,因此您有此行为。

在正常的应用程序中,您的&#34; textBox&#34;将被绑定到某事,这不会是一个真正的问题。

此外,由于您的源是3个完全相同的字符串,因此页面的数据源不会更改。字符串在c#中是不可变的。在这种情况下,您的数据是相同字符串实例的3倍。通常,您将绑定到不同的类。在这种情况下,我不认为更改标签时模板数据源会发生变化。

在你的xaml中,你可以将Text的textBox绑定到&#34; Text = {Binding Path =。}&#34;你将保持完全相同的行为。 (String immuable)

如果您使用新名称创建新标签(在您的来源中添加新的字符串值),您将能够&#34;清除&#34;当您从此选项卡更改时,TextBox中的值。

但这里的核心问题只是你没有绑定任何真实数据。数据所有者是UI,您不会对选项卡控件内容执行任何操作。您必须将TabItems数据附加到源。 (TabItemViewModel列表)如果它们具有相同的UI(相同模板),它们将具有不同的数据实例,并且您的UI将从您的viewmodel数据中刷新。