我在视图中遇到文本框文本更新问题。我见过一些其他线程,但找不到一个接近我的设置。
我有一个类
的模型 interface IPerson : INotifyPropertyChanged
{
string FirstName { get; set;}
}
public class Person
{
public event PropertyChangedEventHandler PropertyChanged = delegate { };
private string _firstName;
public string FirstName
{
get {return _firstName;}
set
{
_firstName = value;
PropertyChanged(this , new PropertChangedEventArgs("FirstName"));
}
}
}
这就是我的viewModel看起来像
interface IViewModel : INotifyPropertyChanged
{
string FirstName { get; set;}
IPerson Person { get; set; }
}
public class viewModel : IViewModel
{
public event PropertyChangedEventHandler PropertyChanged = delegate { };
private IPerson _person;
public Person Person
{
get {return _person;}
set
{
_person = value;
PropertyChanged(this , new PropertyChangedEventArgs("Person"));
}
}
public string FirstName
{
get {return Person.FirstName;}
Set
{
Person.FirstName = value;
PropertyChanged(this , new PropertChangedEventArgs("FirstName"));
}
}
}
Xaml绑定设置
// If i use this binding my model will get updated but my textbox text will never show what the value is in the model
Text="{Binding Path=FirstName ,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay,diag:PresentationTraceSources.TraceLevel=High}"
// This binding works fine both ways
Text="{Binding Path=Person.FirstName ,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay,diag:PresentationTraceSources.TraceLevel=High}"
所以,如果我绑定到Person.First Name一切都很好。如果我绑定到FirstName然后它将更新我的模型,但不会获得TextBox文本的数据。当我在列表中选择一个项目时,这一点就变得很明显了。
有没有人知道为什么会这样。我希望能够绑定到ViewModel Firstname,并将它传递给我的person对象。
答案 0 :(得分:1)
如果您的模型更改了FirsName值,则会触发PropertyChanged事件,但ViewModel不会对其进行扩展(中继)。
要进行第一次绑定工作,ViewModel应该订阅Person.PropertyChanged,然后在嵌套的FirstName更改时引发自己的事件。
但是当然Path=Person.FirstName
绑定更可取。
答案 1 :(得分:0)
使用此绑定“Binding Path = Person.FirstName”,View正在侦听您的viewModel以获取PropertyChanged事件。 View不会监听您的模型(即Person)。
如果要将View的DataContext设置为viewModel,那么为了让View了解模型(即人物)的更改,您必须让viewModel监听模型的PropertyChanged事件。然后,从viewModel中提升PropertyChanged事件。