2015-02-12 28 views
0

我已经开始学习MVVM的一些基本应用程序,我刚刚遇到了下面的绑定问题。绑定MVVM文本框中的自定义对象

我有2个文本框在我的视图say- Student_name和Student_year。我有一个Student类,在我的viewmodel中使用它的属性实现。但是,实际的学生类在我的模型图层中。

<TextBox x:Name="StuName" 
Text="{Binding Path=MyStudent.Name, Mode=TwoWay, 
UpdateSourceTrigger=PropertyChanged}" /> 


<TextBox x:Name="StuYear" 
Text="{Binding Path=MyStudent.Year, Mode=TwoWay, 
UpdateSourceTrigger=PropertyChanged}" /> 

视图模型:

private Student _myStudent = new Student(); 

public Student MyStudent 
{ 
    get { return _myStudent ; } 
    set 
    { 
    if (value != _myStudent) 
     { 
     _myStudent = value; 
     OnPropertyChanged("MyStudent");      
     } 
    } 
} 

模型(研究生班):

public string Name 
    { 
    get { return _name; } 
    set 
    { 
    if (_name!= value) 
    { 
     _name= value;  
     OnPropertyChanged("Name"); 
     } 
    } 
    } 

我所看到的一切从VM绑定值来查看工作的罚款。但是,另一种方式是在这里表现得有点棘手..

Wheneven我在文本框中更改名称/年份,控件必须登陆Viewmodel的Set属性?相反,它马上转到Model的Set属性。

对于实例,当我修改txtbox'StuName'时,调用了Student类的SET方法。但不是ViewModel的SET方法(MyStudent对象)。

我不知道为什么这样做的行为。是因为我直接将Student.Name绑定到文本框?在Viewmodel类中处理此SET操作的替代方法是什么?

在此先感谢。 PS:我已经正确实现了INotifyPropertyChanged接口,其他绑定(原始数据类型的)在其他控件中工作正常。

回答

1

正如Philip Stuyck在his answer中正确指出的那样,ViewModel仅为Student实例设置了一个setter,它永远不会改变。所以ViewModel上的setter永远不会被调用。绑定转到该实例的名称属性。

不同的方法是将name属性明确地包装在ViewModel中。这样可以更清晰地分离Model和ViewModel之间的关注点。即现在你的Model实现了INotifyPropertyChanged这个IMO属于ViewModel,因为它通常只用于触发View更新。您的视图模型是这样的:

class StudentViewModel 
{ 
    private Student _myStudent = new Student(); 

    public string Name 
    { 
     get { return _myStudent.Name ; } 
     set 
     { 
      if (value != _myStudent.Name) 
      { 
       _myStudent.Name = value; 
       OnPropertyChanged("Name");      
      } 
     } 
    } 
} 

你在另一方面模型变得更简单,因为它没有实现INotifyPropertyChanged了。

+0

感谢您的回应:) +1建议替代解决方法 – Bharathi 2015-02-12 10:18:16

1

这是正常行为,因为您的绑定是MyStudent.Name。 所以Mystudent setter永远不会被调用,因为实例永远不会改变。 名称的setter被调用,因为事实上,这是您的绑定将要去的地方。