2015-06-01 2 views
0

Я разрабатываю небольшое приложение, управляемое данными, используя 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(); 
    } 
} 
+0

Вам нужно добавить некоторые из ваших XAML - похоже, что ваши привязки неверны. Нам также нужен какой-то контекст, как выглядит ваш пользовательский интерфейс - 'SelectedMember' подразумевает, что существует коллекция' Members', и вы никогда не добавляете к этому свой новый элемент. –

+0

Добавил XAML к основному вопросу. Я не могу понять мини-уценку для жизни меня. – Jake

ответ

0

Я решил это ... как-то ...

Я не уверен, что я сделал, но, видимо, установка ViewModel в конструкторе представления удалось повредить все.

Так происходит из этого:

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

к этому:

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

устранила проблему.

+1

Если он работает без чего-то еще (рамки? Родительский вид?) устанавливает ваш «DataContext». Установив его * снова * в конструкторе, это, вероятно, означало, что вы делали изменения в экземпляре, который не был привязан к вашему представлению, поэтому обновления не отражаются в представлении. –

+0

Скорее всего, сейчас все проверяется и обновляется. По крайней мере, я оказался в правильном направлении. – Jake