将代码移到viewModel类绑定

时间:2016-05-13 19:28:38

标签: c# wpf xaml mvvm

在了解了ObservableCollectionINotifyPropertyChanged之后,我尝试使用它们将我的代码划分为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类

  1. 现在在新的viewModel类中我有ObservableCollection personList(而不是后面的代码),但将计算方法和属性放在这里也是错误的吗?如果我在此处放置计算属性,则此viewModel将继承INotifyPropertyChanged,因此当totalIncome属性更改时,它将自动更改UI。将它放在人模型中是没有意义的,因为该类代表一个人。

  2. 如何将viewModel中的人员列表绑定到xaml?如果列表在代码隐藏中,我可以只做peopleDisplay.ItemsSource = peopleList;,但是这个viewModel是一个类,而不是一个ObservableCollection对象,我不能将它设置为dataGrid的ItemsSource。有没有办法在viewModel类中绑定它?我正在学习mvvm,所以我也可能在这里做错了。请建议

2 个答案:

答案 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>

Reference 1

Reference 2

答案 1 :(得分:1)

1)我没有看到你的方法有任何问题,但是,如果有一天你想测试计算&#34; TotalIncome&#34;的方法会怎么样?您可以在辅助类中分离计算。

2)首先,您必须使用公共属性在ViewModel中公开集合。话虽如此,你必须在你的xaml文件中声明绑定。

<DataGrid  x:Name="peopleDisplay"
           ItemsSource="{Binding MyPropertyOnViewModel}">
</DataGrid>

不要忘记使用viewmodel设置窗口的DataContext。