【发布时间】:2016-05-13 19:28:37
【问题描述】:
在了解了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。但是,将它放在 person 模型中是没有意义的,因为该类代表一个人。如何将 viewModel 中的人员列表绑定到 xaml?如果列表在代码隐藏中,我可以做
peopleDisplay.ItemsSource = peopleList;,但是这个viewModel 是一个类而不是ObservableCollection 对象,我不能将它设置为dataGrid 的ItemsSource。有没有办法在 viewModel 类中绑定它?我正在学习 mvvm,所以我也可能在这里做错了。请指教
【问题讨论】:
-
你必须再次分离你的类,比如 ViewModel 和 Model,并且你的 Model 包含像一个人这样的单个实例,然后你的 View Model 将保存人员列表。
-
是的,代码是在分离之前,我现在试图将它分开,所以我问了两个问题以确保我的方法是正确的,因为我在分离后的绑定部分遇到了一些问题