在了解了ObservableCollection
和INotifyPropertyChanged
之后,我尝试使用它们将我的代码划分为MVVM
。
但我在代码隐藏类之外的绑定方面遇到了一些麻烦。
我的应用程序有三个框,可让您输入一个人的姓名,收入,年龄。然后它将在DataGrid上显示它们。
XAML:
<Window x:Class="myApp.MainWindow"
[...]
<Grid>
<DataGrid x:Name="peopleDisplay">
</DataGrid>
</Grid>
</Window>
MainWindow.xaml.cs中的(无结构)
public partial class MainWindow : Window
{
private ObservableCollection<Person> peopleList = new ObservableCollection<Person>();
public MainWindow()
{
InitializeComponent();
peopleDisplay.ItemsSource = peopleList;
}
private void btnAddProduct_Click(object sender, RoutedEventArgs e)
{
peopleList.Add(new Person { personName = nameBox.text, income = incomebox.text, age = ageBox.text });
}
[...]
}
class People : INotifyPropertyChanged
{
private string personName;
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
public string PersonName {
get
{
return this.personName;
}
set
{
if( this.personName != value)
{
this.PersonName = value;
this.NotifyPropertyChanged("PersonName");
}
}
}
public int age { get; set; }
public double income { get; set; }
}
我的主要问题:
所以现在我尝试做两件事:添加一个新函数来计算每个人的总收入,将上面的ObservableCollection移动到viewModel类
现在在新的viewModel类中我有ObservableCollection personList
(而不是后面的代码),但将计算方法和属性放在这里也是错误的吗?如果我在此处放置计算属性,则此viewModel将继承INotifyPropertyChanged,因此当totalIncome属性更改时,它将自动更改UI。将它放在人模型中是没有意义的,因为该类代表一个人。
如何将viewModel中的人员列表绑定到xaml?如果列表在代码隐藏中,我可以只做peopleDisplay.ItemsSource = peopleList;
,但是这个viewModel是一个类,而不是一个ObservableCollection对象,我不能将它设置为dataGrid的ItemsSource。有没有办法在viewModel类中绑定它?我正在学习mvvm,所以我也可能在这里做错了。请建议
答案 0 :(得分:3)
您的Model
课程是人。如下所示:
public class People : INotifyPropertyChanged
{
private string personName;
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public string PersonName
{
get
{
return this.personName;
}
set
{
if( this.personName != value)
{
this.PersonName = value;
this.NotifyPropertyChanged();
}
}
}
public int Age { get; set; }
public double Income { get; set; }
}
您的ViewModel
如下:
public class PeopleViewModel
{
Public List<People> ListOfPeople { get; set; }
}
ViewModel
可以实现INotifyPropertyChanged
界面来通知视图。
现在,您可以将数据上下文设置为PeopleViewModel
,并将ListOfPeople
绑定到DataGrid
。
为您的DataContext
设置View
,您可以从XAML或后面的代码中执行此操作。
为ItemsSource
中的DataGrid
设置View
。
XAML:
<Window x:Class="myApp.MainWindow" DataContext="{Binding PeopleViewModel }">
<Grid>
<DataGrid x:Name="peopleDisplay" ItemSource={Binding ListOfPeople}>
......
</DataGrid>
</Grid>
</Window>
答案 1 :(得分:1)
1)我没有看到你的方法有任何问题,但是,如果有一天你想测试计算&#34; TotalIncome&#34;的方法会怎么样?您可以在辅助类中分离计算。
2)首先,您必须使用公共属性在ViewModel中公开集合。话虽如此,你必须在你的xaml文件中声明绑定。
<DataGrid x:Name="peopleDisplay"
ItemsSource="{Binding MyPropertyOnViewModel}">
</DataGrid>
不要忘记使用viewmodel设置窗口的DataContext。