为什么这些标签似乎共享相同的文本框?

我在xaml中定义了我的UI,下面是我的代码:

                

当我运行我的程序时。 我可以添加很多选项卡没有问题。 标题是不同的,但每当我在其中一个标签中更改文本框的内容时,其他标签中的所有文本框都会更改为相同的内容(好像它们都共享相同的文本框,或者绑定到相同的源,这很奇怪) 。

我在定义用户界面时犯了错误吗? 请帮助我,并提前感谢。

这是我的模型,非常简单:

 using System; using System.Collections.ObjectModel; using System.ComponentModel; namespace MyHomework__MVVM_ { class MyHomeworkModel : INotifyPropertyChanged { private string header, text; public event PropertyChangedEventHandler PropertyChanged; public string Header { get { return header; } set { header = value; OnPropertyChanged("Header"); } } public string Text { get { return text; } set { text = value; OnPropertyChanged("Text"); } } private void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } } } 

而我的viewmodel,仍然非常简单:

 using MyHomework; using System.Collections.ObjectModel; using System.ComponentModel; using System.Windows.Input; namespace MyHomework__MVVM_ { class MyHomeworkViewModel : INotifyPropertyChanged { private ObservableCollection allTabs; private MyHomeworkModel selectedTab; public event PropertyChangedEventHandler PropertyChanged; public MyHomeworkViewModel() { allTabs = new ObservableCollection(); selectedTab = new MyHomeworkModel(); AddCourseCommand = new AddCourseCommand(this); } public ObservableCollection AllTabs { get { return allTabs; } set { allTabs = value; OnPropertyChanged("AllTabs"); } } public MyHomeworkModel SelectedTab { get { return selectedTab; } set { selectedTab = value; OnPropertyChanged("SelectedTab"); } } public ICommand AddCourseCommand { get; private set; } public void AddNewTab() { NewCourseName ncn = new NewCourseName(); ncn.ShowDialog(); if (ncn.courseName != null) { MyHomeworkModel newTab = new MyHomeworkModel(); newTab.Header = ncn.courseName; newTab.Text = ncn.courseName; AllTabs.Add(newTab); SelectedTab = newTab; } } private void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } } } 

编辑:刚刚注意到我收到了这条消息:

 System.Windows.Data Error: 40 : BindingExpression path error: 'Text' property not found on 'object' ''MyHomeworkViewModel' (HashCode=31265986)'. BindingExpression:Path=Text; DataItem='MyHomeworkViewModel' (HashCode=31265986); target element is 'TextBox' (Name=''); target property is 'Text' (type 'String') 

我想我知道为什么抱怨。 我的Text属性是MyHomeworkModel而不是MyHomeworkViewModel …但是为什么我把它绑定到MyHomeworkModel中的Header属性没问题呢?

我的AddCourseCommand类:

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Input; namespace MyHomework__MVVM_ { class AddCourseCommand : ICommand { private MyHomeworkViewModel viewModel; public AddCourseCommand(MyHomeworkViewModel viewModel) { this.viewModel = viewModel; } public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } public bool CanExecute(object parameter) { return true; } public void Execute(object parameter) { viewModel.AddNewTab(); } } } 

它似乎是您的模型实现

 ObservableCollection. 

删除此Base类,它应该工作。

编辑

你需要改变:

  AddCourseCommand = new AddCourseCommand(this); 

下载DelegateCommand

  AddCourseCommand = new DelegateCommand(AddNewTab); 

编辑:

您可以从UI中剪切ViewModel。 您将实例复制到您的命令,然后调用该复制添加。 这是错误的并且属性你的错误。 我真的建议你使用DelegateCommand这可能会修复它。

你的猜测:

我想我知道为什么抱怨。 我的Text属性是MyHomeworkModel而不是MyHomeworkViewModel …但是为什么我把它绑定到MyHomeworkModel中的Header属性没问题呢?

你的属性在MyHomeworkModel是正确的,而不是在你绑定到包含MyHomeworkModel的List的MyHomeworkModel 。 现在,您添加Binding将在最低级别设置的新项目。 在这种情况下,你的MyHomeworkModel而不是MyHomeworkViewModel