C# 为什么这些选项卡似乎共享同一个文本框?
我在xaml中定义了我的UI,下面是我的代码:C# 为什么这些选项卡似乎共享同一个文本框?,c#,C#,我在xaml中定义了我的UI,下面是我的代码: <TabControl HorizontalAlignment="Left" Height="330" VerticalAlignment="Top" Width="764" Margin="10,10,0,0" ItemsSource="{Binding AllTabs}" SelectedItem="{Binding SelectedTab}"> <TabControl.ItemContainerStyle&g
<TabControl HorizontalAlignment="Left" Height="330" VerticalAlignment="Top" Width="764" Margin="10,10,0,0" ItemsSource="{Binding AllTabs}" SelectedItem="{Binding SelectedTab}">
<TabControl.ItemContainerStyle>
<Style TargetType="TabItem">
<Setter Property="Header" Value="{Binding Header}"/>
<Setter Property="Content">
<Setter.Value>
<Grid>
<TextBox Text="{Binding Text}" FontSize="16" AcceptsReturn="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
</TextBox>
</Grid>
</Setter.Value>
</Setter>
<Setter Property="FontSize" Value="20"/>
</Style>
</TabControl.ItemContainerStyle>
</TabControl>
还有我的viewmodel,它仍然非常简单:
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));
}
}
}
}
using MyHomework;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows.Input;
namespace MyHomework__MVVM_
{
class MyHomeworkViewModel : INotifyPropertyChanged
{
private ObservableCollection<MyHomeworkModel> allTabs;
private MyHomeworkModel selectedTab;
public event PropertyChangedEventHandler PropertyChanged;
public MyHomeworkViewModel()
{
allTabs = new ObservableCollection<MyHomeworkModel>();
selectedTab = new MyHomeworkModel();
AddCourseCommand = new AddCourseCommand(this);
}
public ObservableCollection<MyHomeworkModel> 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));
}
}
}
}
我想我知道它为什么抱怨。我的文本属性是MyHomeworkModel不是MyHomeworkViewModel…但是为什么我可以将头绑定到MyHomeworkModel中的头属性呢
我的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<MyHomeworkModel>.
到
下载
编辑:
从UI中剪切ViewModel。将实例复制到命令中,然后调用该复制添加。这是错误的,是你的错。我真的建议你使用DelegateCommand这可能会解决它
据你猜测:
我想我知道它为什么抱怨。我的文本属性是MyHomeworkModel不是MyHomeworkViewModel…但是为什么我可以将头绑定到MyHomeworkModel中的头属性呢
您的属性位于
MyHomeworkModel
中,而不在MyHomeworkViewModel
中,这是正确的。您绑定到一个包含MyHomeworkModel
s的列表上。现在添加一个新项,绑定将在最低级别设置。在这种情况下,如果您的MyHomeworkModel
不在MyHomeworkViewModel
中,您的XAML代码没有问题,您可以添加您的ViewModel和Model吗?相同的代码?还是你改变了?是的。我改变了我的模型…同样的问题,当我添加第一个标签时,我没有发现绑定错误。当我添加第二个标签时,我做了。但这是我的标签集合的模型,对吗?如果我删除它,我将没有任何对象可添加我的选项卡。第一个是正确的,但第二个是错误的。如果要更改代码中的属性,则模型应实现INotifyPropertyChanged,但如果每次更改属性时都从ObservableCollection继承,则此基类将通知所有其他属性已更改。您可以将每个对象添加到ObservaleCollection,如果其类型与此类型参数ObservaleCollection相同。你最好告诉自己AddNewTab()是无效的,因为它只是向集合中添加了一个新的HomeworkModel对象,并且此更改将反映在UI上……此外,我的AddCourseCommand构造函数将viewmodel对象作为参数……这毫无意义。ICommand只是一个简单的接口,您不能实例化接口!这很伤脑筋啊!并且没有使用AddNewTab分配AddCourseCommand。它不应该出现在函数中!请展示该类的实现。现在,你似乎用一个新的接口实例来实例你的接口,这简直是胡说八道。
ObservableCollection<MyHomeworkModel>.
AddCourseCommand = new AddCourseCommand(this);
AddCourseCommand = new DelegateCommand(AddNewTab);