Я разрабатываю небольшое приложение, управляемое данными, используя C# и MVVMLight, и я столкнулся с проблемой при попытке добавить/отредактировать новый элемент.MVVMLight - UI не обновляется при изменении свойства
В принципе, я могу установить свойство 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.
}
Пользовательский интерфейс не обновляется, и кажется, что объект член в 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')
У меня такое чувство, что я сделал что-то глупое ... но что?
Edit 2: Вышеуказанные ошибки исправляются, но интерфейс еще не обновляется, когда SelectedMember изменилось даже с явным вызовом RaisePropertyChanged.
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();
}
}
Вам нужно добавить некоторые из ваших XAML - похоже, что ваши привязки неверны. Нам также нужен какой-то контекст, как выглядит ваш пользовательский интерфейс - 'SelectedMember' подразумевает, что существует коллекция' Members', и вы никогда не добавляете к этому свой новый элемент. –
Добавил XAML к основному вопросу. Я не могу понять мини-уценку для жизни меня. – Jake