对于包含在datacontext集的父控件中的子控件,WPF ViewModel更改未更新
我有两个StackPanel,一个有datacontext集,其中的子控件绑定到对象的属性。第二个stackpanel没有数据绑定,但子控件引用对象和属性 更新viewmodel中的对象时,对firstname和lastname所做的更改显示在第二个stackpanel中,但第一个面板中没有任何更改,我不明白为什么?有人对为什么首次加载应用程序时,两个面板中都会显示正确的详细信息有什么建议吗?只有通过viewmodel进行更改时,问题才会出现 XAML:对于包含在datacontext集的父控件中的子控件,WPF ViewModel更改未更新,wpf,mvvm,data-binding,Wpf,Mvvm,Data Binding,我有两个StackPanel,一个有datacontext集,其中的子控件绑定到对象的属性。第二个stackpanel没有数据绑定,但子控件引用对象和属性 更新viewmodel中的对象时,对firstname和lastname所做的更改显示在第二个stackpanel中,但第一个面板中没有任何更改,我不明白为什么?有人对为什么首次加载应用程序时,两个面板中都会显示正确的详细信息有什么建议吗?只有通过viewmodel进行更改时,问题才会出现 XAML: 更新 附件是整个解决方案的副本,说明
更新
附件是整个解决方案的副本,说明可以找到问题
非常感谢您的帮助 我制作了一个如下的XAML:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel>
<StackPanel DataContext="{Binding Person}" >
<TextBlock Text="{Binding FirstName}" ></TextBlock>
<TextBox Text="{Binding LastName}" ></TextBox>
<Button Command="{Binding DataContext.Commands.Update, ElementName=mainView}" VerticalAlignment="Bottom" Margin="0,0,0,20" Width="75">Update</Button>
</StackPanel>
<StackPanel >
<TextBlock Text="{Binding Person.FirstName}"></TextBlock>
<TextBox Text="{Binding Person.LastName}"></TextBox>
</StackPanel>
</StackPanel>
</Grid>
</Window>
而且……它起作用了
这是主视图模型:
public class MainViewModel : ViewModelBase
{
private Person person;
public Person Person
{
get { return person; }
set
{
if (person != value)
{
person = value;
OnPropertyChanged("Person");
}
}
}
}
然后,这是person类
public class Person : ViewModelBase
{
private string lastName;
public string LastName
{
get { return lastName; }
set
{
if (lastName != value)
{
lastName = value;
OnPropertyChanged("LastName");
}
}
}
private string firstName;
public string FirstName
{
get { return firstName; }
set
{
if (firstName != value)
{
firstName = value;
OnPropertyChanged("FirstName");
}
}
}
}
希望有帮助您也能给我们看一下viewmodel吗?很抱歉,忘了添加链接,我现在已经添加了它。我已经检查了您的代码-您的
Person
类还应该实现INotifyPropertyChanged
,它的FirstName
和LastName
属性应该引发PropertyChanged
事件。我认为纠正这一点应该可以解决您的问题。@Grx70-这已经完成了技巧,效果很好-非常感谢您,但是您在哪里/何时更改FirstName
和/或LastName
(这是OP有问题的部分)?您不能从UI更改FirstName,因为它是一个文本块,但是从ViewModel可以更改它。(换句话说,它的绑定是单向的..我将为您提供MainViewModel和Person类
public class MainViewModel : ViewModelBase
{
private Person person;
public Person Person
{
get { return person; }
set
{
if (person != value)
{
person = value;
OnPropertyChanged("Person");
}
}
}
}
public class Person : ViewModelBase
{
private string lastName;
public string LastName
{
get { return lastName; }
set
{
if (lastName != value)
{
lastName = value;
OnPropertyChanged("LastName");
}
}
}
private string firstName;
public string FirstName
{
get { return firstName; }
set
{
if (firstName != value)
{
firstName = value;
OnPropertyChanged("FirstName");
}
}
}
}