2014-07-07 2 views
1

У меня такое ощущение, что мое представление не обновляется, потому что событие NotifyPropertyChanged запускается до создания пользовательского интерфейса, но я не знаю, как это преодолеть.View Model не обновляет пользовательский интерфейс, когда внутри конструктора

Я действительно не отправляю код для анализа, потому что знаю, что работа с данными работает. Они просто терпят неудачу во время построения страницы.

Я строго публикую его, чтобы вы могли понять, о чем я говорю.

public Obj1 SelectedObj1 
    { 
     get { return _SelectedObj1; } 
     set { _SelectedObj1 = value; NotifyPropertyChanged("SelectedObj1"); } 
    } 

    public Obj2 SelectedObj2 
    { 
     get { return _SelectedObj2; } 
     set { _SelectedObj2= value; NotifyPropertyChanged("SelectedObj2"); } 
    } 

    public Obj3 SelectedObj3 
    { 
     get { return _SelectedObj3; } 
     set { _SelectedObj3 = value; NotifyPropertyChanged("SelectedObj3"); } 
    } 

Внутри моего конструктора

public constructor(){ 
    BuildFakeData(); 
    SelectedObj1 = observableCollection[0]; 
    SelectedObj2 = SelectedObj1.obj2s.Count > 0 ? SelectedObj1.obj2s[0] : null; 
    SelectedObj3 = SelectedObj2.obj3s.Count > 0 ? SelectedObj2.obj3s[0] : null; 
    } 

Мой вопрос, когда вы делаете MVVM, если установить связанные свойства в конструкторе, скажем, для DataGrid выбран Row, он будет заполнять или это провал потому что XAML еще не построен?

Вот где DataContext создается в представлении

<Window.Resources> 
     <vm:ViewModel x:Key="viewModel"/> 
    </Window.Resources> 
    <Grid 
     DataContext="{StaticResource viewModel}"> 

Вот где я устанавливаю выбранный элемент для сетки

<igWPF:XamDataGrid      
     ActiveDataItem="{Binding SelectedObj1}" 
     DataSource="{Binding observableCollection}" 
+0

** Не относится: ** LINQ - ваш друг. Удалите этот ненужный условный оператор и используйте 'SelectObj11.obj2s.FirstOrDefault()'. –

+1

@HighCore Я на самом деле делаю это в производственном коде. Я просто сделал это таким образом, чтобы ограничить любую путаницу. Однако, спасибо. –

+0

@AnthonyRussell Я установил свойства в конструкторе, и мое представление обновлено правильно. У вас есть какие-либо ошибки привязки в выходе? Кроме того, когда вы устанавливаете 'DataContext' для View –

ответ

0

Если ваш взгляд ещё когда не существует созданная модель, тогда, конечно, представление еще не прослушивается, когда ваши свойства обновляются. Однако, когда создается представление и модель представления назначается как его контекст данных, представление автоматически загружает значения из модели представления (контекст данных).

Итак, INPC не может быть проблемой вообще. Вы можете создавать свойства без INPC в своем примере и работать с ним (поскольку значения уже заданы в конструкторе).

Смежные вопросы