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”);
}
}
}
下面是描述具有奇怪行为的图像
谁能告诉我为什么会发生这种情况以及如何解决
- 如需了解更多信息,请添加评论
提前谢谢 在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的情况下,如何修复此问题。