C# MVVMLight-属性更改时UI未更新

C# MVVMLight-属性更改时UI未更新,c#,entity-framework,mvvm,mvvm-light,C#,Entity Framework,Mvvm,Mvvm Light,我正在使用C#和MVVMLight开发一个小型数据驱动应用程序,在尝试添加/编辑新项目时遇到了问题 基本上,我可以将SelectedMember属性设置为构造函数中已存在于数据库中的成员对象,而不会出现任何问题: public MemberDetailViewModel() { _context = new DatabaseEntities(); GetMembers(); // This just loads the Member objects into an Observ

我正在使用C#和MVVMLight开发一个小型数据驱动应用程序,在尝试添加/编辑新项目时遇到了问题

基本上,我可以将SelectedMember属性设置为构造函数中已存在于数据库中的成员对象,而不会出现任何问题:

public MemberDetailViewModel()
{
    _context = new DatabaseEntities();
     GetMembers(); // This just loads the Member objects into an ObservableCollection.
     SelectedMember = _members.FirstOrDefault(); // UI updates as expected.
}
SelectedMember的实现方式如下:

public Member SelectedMember
{
    get { return _selectedMember; }
    set { Set(ref _selectedMember, value); }
}
现在,这很好,因为当我编辑对象时,所有的数据验证都有效

但是,当我使用以下代码添加新对象时:

private void NewMember()
{
    var member = new Member();
    SelectedMember = member; // UI doesn't update, is still on previous object.
}
UI不会更新,并且SelectedMember中的成员对象似乎与构造函数中加载的成员对象相同

此外,当我从构造函数将空对象加载到SelectedMember属性中时,应用程序似乎不知道它存在,并且当我编辑控件中的值时,不会触发任何数据验证例程:

public MemberDetailViewModel()
{
    _context = new DatabaseEntities();
     SelectedMember = new Member(); // Binding appears to fail, data validation code not firing when control values changed.
}
我做错了什么

编辑: 只是在视图模型实际加载时查看了输出,我看到了这一点

System.Windows.Data Error: 40 : BindingExpression path error: 'Centres' property not found on 'object' ''Member_B31A44ECE333F4E7E07BE25FA5BDC79874BAE6C64589F9765ACA373D89BBBD6B' (HashCode=45485186)'. BindingExpression:Path=Centres; DataItem='Member_B31A44ECE333F4E7E07BE25FA5BDC79874BAE6C64589F9765ACA373D89BBBD6B' (HashCode=45485186); target element is 'ComboBox' (Name=''); target property is 'ItemsSource' (type 'IEnumerable')
System.Windows.Data Warning: 40 : BindingExpression path error: 'SelectedMember' property not found on 'object' ''Member_B31A44ECE333F4E7E07BE25FA5BDC79874BAE6C64589F9765ACA373D89BBBD6B' (HashCode=45485186)'. BindingExpression:Path=SelectedMember.LocalCentre; DataItem='Member_B31A44ECE333F4E7E07BE25FA5BDC79874BAE6C64589F9765ACA373D89BBBD6B' (HashCode=45485186); target element is 'ComboBox' (Name=''); target property is 'SelectedValue' (type 'Object')
我觉得我做了些蠢事。。。但是什么呢

编辑2: 上述错误已修复,但即使显式调用RaisePropertyChanged,当SelectedMember发生更改时,UI仍不会更新

Edit3: 希望这就是您需要的XAML:

<UserControl x:Class="Project.Views.MemberDetailView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:models="clr-namespace:Project.Client.Models"
         mc:Ignorable="d" 
         d:DesignHeight="600" d:DesignWidth="800">
<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Assets/ResourceDictionaries/DataEntryScreens.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>
<WrapPanel>
    <Expander Header="Personal Information">
        <StackPanel Orientation="Vertical">
            <StackPanel Orientation="Vertical">
                <TextBlock Text="Forename:" />
                <TextBox Text="{Binding SelectedMember.Forename, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"/>
            </StackPanel>
            <!-- Other controls omitted. -->
        </Expander>
    </WrapPanel>
</UserControl>

<!--MemberDetailView.xaml.cs-->
public partial class MemberDetailView : UserControl
{
    public MemberDetailView()
    {
        InitializeComponent();
        this.DataContext = new MemberDetailViewModel();
    }
}

公共部分类MemberDetailView:UserControl
{
公共成员详细信息视图()
{
初始化组件();
this.DataContext=new MemberDetailViewModel();
}
}

我已经解决了这个问题。。。不知怎的

我不确定我做了什么,但显然在视图的构造函数中设置了一个ViewModel会把一切都搞糟

从这里开始:

public MemberDetailView()
{
    InitializeComponent();
    this.DataContext = new MemberDetailViewModel() { Header = "Members" };
}
为此:

public MemberDetailView()
{
    InitializeComponent();
    //this.DataContext = new MemberDetailViewModel() { Header = "Members" };
}

已修复该问题。

您需要添加一些XAML-看起来您的绑定不正确。我们还需要一些您的UI外观的上下文-
SelectedMember
意味着存在一个
成员
集合,并且您从不将新项目添加到此集合。将XAML添加到主要问题中。我无法为自己的生活计算出最小的降价。如果没有其他东西(框架?父视图?)就可以设置您的
DataContext
。通过在构造函数中再次设置,这可能意味着您对未绑定到视图的实例所做的更改-因此更新不会反映在视图中。很可能是这样,现在所有内容都已正确验证和更新。至少我被指向了正确的方向。