对于包含在datacontext集的父控件中的子控件,WPF ViewModel更改未更新

对于包含在datacontext集的父控件中的子控件,WPF ViewModel更改未更新,wpf,mvvm,data-binding,Wpf,Mvvm,Data Binding,我有两个StackPanel,一个有datacontext集,其中的子控件绑定到对象的属性。第二个stackpanel没有数据绑定,但子控件引用对象和属性 更新viewmodel中的对象时,对firstname和lastname所做的更改显示在第二个stackpanel中,但第一个面板中没有任何更改,我不明白为什么?有人对为什么首次加载应用程序时,两个面板中都会显示正确的详细信息有什么建议吗?只有通过viewmodel进行更改时,问题才会出现 XAML: 更新 附件是整个解决方案的副本,说明

我有两个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");
            }
        }
    }

}