Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TabItem行为异常,多个tabitems共享内容_C#_.net_Wpf_Mvvm_Tabs - Fatal编程技术网

C# TabItem行为异常,多个tabitems共享内容

C# TabItem行为异常,多个tabitems共享内容,c#,.net,wpf,mvvm,tabs,C#,.net,Wpf,Mvvm,Tabs,更改任何选项卡都会更改其他选项卡 代码说明: =================== using System.Collections.ObjectModel; using System.Windows; namespace TabAnalyzer { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class Ma

更改任何选项卡都会更改其他选项卡

代码说明:

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

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");
        }
    }
}
TabControl的items源绑定到长度/计数为3的字符串集合。因此,创建了3个选项卡项。但他们的行为就像一个。您键入任何选项卡项,它将反映在其他两个选项卡项中

下面是一个简单的xaml和nehind代码

<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");
        }
    }
}
使用System.Collections.ObjectModel;
使用System.Windows;
命名空间选项卡分析器
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
this.DataContext=new StringCol().strdata;
}
}
公共类字符串
{
公共可观测收集标准数据
{
得到;
设置
}
公共语言()
{
strdata=新的ObservableCollection();
添加标准数据(“hkhdfkshdfk”);
添加标准数据(“hkhdfkshdfk”);
添加标准数据(“hkhdfkshdfk”);
}
}
}
下面是描述具有奇怪行为的图像

谁能告诉我为什么会发生这种情况以及如何解决

  • 如需了解更多信息,请添加评论
注意:我使用的是VS2013


提前谢谢

在WPF中,如果模板发生更改,则不会重新生成UI布局/控件。通常的行为是保留模板,只更新数据

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

在正常的应用程序中,您的“文本框”将绑定到某个东西上,这不是一个真正的问题

此外,由于您的源是3个相同的字符串,因此页面的数据源不会更改。字符串在c#中是不可变的。在本例中,您的数据是同一字符串实例的3倍。通常,您会绑定到不同的类。在这种情况下,我认为当您更改选项卡时,模板数据源不会更改

在xaml中,可以将文本的文本框绑定到“Text={Binding Path=.}”,并保持完全相同的行为。(字符串不可变)

如果使用新名称创建一个新选项卡(在源代码中添加一个新字符串值),则当您从或更改到此选项卡时,可以“清除”文本框中的值


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

其他选项卡的xaml代码在哪里?我有一个tabcontrol。它的items source设置为集合,因此创建了3个tabitems。但所有3个选项卡项的行为都像一个。如果您更改了任何一个选项卡项中的数据,那么其他两个选项卡项将显示相同的数据。您可能希望在此处了解发生这种情况的原因以及可能的解决方法:谢谢elgonzo。我知道问题的原因了。谢谢你的解释。我知道这可以通过绑定Textbox的Text属性来修复。但是如果我想在我的标签里有一个RichTextBox呢。RichTextBox的文档属性不是依赖项属性,因此无法绑定RichTextBox。因此,在使用RichTextBox的情况下,如何修复此问题。