为了练习 WPF+MVVM,我决定编写一个学校程序。
到目前为止,我有班级和学生班。
还有派生自 INPC 的基本视图模型 ViewModelBase.cs 和实例类 - “StudentClass”。
所有其他视图模型都派生自 viewmodelbase。
问题是我对每个“功能”都有一个页面/窗口(例如;查看所有学生、添加学生、删除学生等......)并且我希望能够从任何地方访问该课程应用程序,因为所有信息基本上都存储在那里。
为了保持井井有条,每个“功能”都有自己的视图模型(StudentListViewModel.cs、AddStudentViewModel.cs...)。
我试图从视图模型中访问类,这只是导致类在一个窗口中更新而不在另一个窗口中更新的情况。
当我设置“学生列表”窗口和“添加学生”窗口的视图模型时,列表显然是同步的。所以我想问题是类实例被重复或类似的东西。
我已上传项目以供参考:http ://www.mediafire.com/?n70c7caqex6be1g
希望有人可以帮助我。
我尝试在谷歌上寻找答案,但所有答案都提到了与框架相关的“信使”和“事件”。而且由于我没有为该项目使用框架,因此这些解决方案不适用于我。
另一种解决方案是将视图模型的实例传递给另一个,但我的视图模型都没有调用或实例化另一个视图模型。
更新:
StudentList.xaml 中的 XAML:(这是一个用户控件,因为我使用的是名为 ModernUI 的模板)
<UserControl x:Class="ClassStudent.StudentList"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300" DataContext="{StaticResource StudentListViewModel}">
<Grid Style="{StaticResource ContentRoot}">
<ListView ItemsSource="{Binding StudentClass.StudentList}" >
<ListView.View>
<GridView>
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" Width="60"/>
<GridViewColumn Header="Age" DisplayMemberBinding="{Binding LastName}" Width="60"/>
</GridView>
</ListView.View>
</ListView>
</Grid>
AddStudent.xaml 中的 XAML:
<UserControl x:Class="ClassStudent.AddStudent"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid Style="{StaticResource ContentRoot}" DataContext="{StaticResource AddStudentViewModel}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label Content="Name"/>
<TextBox Text="{Binding Student.Name, Mode=TwoWay}" Grid.Column="1"/>
<Label Content="Last Name" Grid.Row="1"/>
<TextBox Text="{Binding Student.LastName, Mode=TwoWay}" Grid.Row="1" Grid.Column="1"/>
<Button Command="{Binding AddStudent}" Content="Add Student!" Grid.Row="2" />
</Grid>
添加StudentViewModel.cs:
public class AddStudentViewModel : ViewModelBase
{
private Student _student;
private ICommand _addStudent;
private ViewModelBase newIns;
public ICommand AddStudent
{
get
{
if (_addStudent == null)
{
_addStudent = new RelayCommand(param => this.Add(), null);
}
return _addStudent;
}
}
public Student Student
{
get
{
return _student;
}
set
{
_student = value;
NotifyPropertyChanged("Student");
}
}
private void Add()
{
StudentClass.StudentList.Add(Student);
Student = new Student();
}
public AddStudentViewModel()
{
Student = new Student();
}
}
ViewModelBase.cs:
public class ViewModelBase : INotifyPropertyChanged
{
private Class _studclass;
public Class StudentClass
{
get { return _studclass; }
set
{
_studclass = value;
NotifyPropertyChanged("StudentClass");
}
}
public ViewModelBase()
{
StudentClass = new Class();
Student asaf = new Student();
asaf.Name = "Asaf";
asaf.LastName = "biton";
StudentClass.StudentList.Add(asaf);
}
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(string PropertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
}
}
}