Как восстановить control' s viewmodel после создания?

У меня есть Окно и UserControl. UserControl создает свой собственный viewmodel как это:



    
        
    

    
        
    


Когда Окно иллюстрирует примерами UserControl, я хочу, чтобы viewmodel Окна был в состоянии восстановить viewmodel UserControl.



    
        
    

    
        
    


У viewmodel Окна есть публично settable собственность текстового объекта. С закреплением DataContext я ожидаю, что, как только UserControl3 создается стоимость его DataContext (который является ссылкой на его viewmodel), был бы назначен на собственность UserControl3Vm на viewmodel Окна.

То, что на самом деле происходит, то, что Окно. Имущественного сеттера UserControl3Vm вызывают с пустым указателем стоимости.

Почему это происходит, и что лучший способ состоит в том, чтобы достигнуть того, что я имею в виду?

Я знаю, что было бы легче иллюстрировать примерами viewmodel для UserControl, поскольку собственность на viewmodel для Окна и иметь UserControl просто связывает на это, (и это также минимизировало бы сцепление представлений об их viewmodels). Но где я работаю, они немного сумасшедшие и предпочитают представление первый MVVM вместо viewmodel сначала, таким образом, я ищу наиболее расцепленный способ позволить viewmodels к collaberate эффективно, когда viewmodels вместо этого создаются их взглядами.

1
nl ja de

2 ответы

Я не думаю, что это будет работать, чтобы использовать OneWayToSource связывающий без некоторого кода - позади.

Первоначально, ваш UserControl. DataContext установлен в случай UserControl3vm , однако вы заменяете UserControl3vm с Закреплением, таким образом, на ваш оригинал UserControl3vm больше не ссылаются нигде.

Для OneWayToSource связывающий, чтобы работать, необходимо было бы сначала установить DataContext к вашему OneWayToSource закрепление, и затем установить Источник закрепления в новый случай UserControl3vm из UserControl.

Если я помню правильно, можно получить использование закрепления BindingOperations. GetBindingExpression, и обновление это DataItem собственность. Вы не можете просто установить UserControl. DataContext , потому что это переписало бы ваш OneWayToSource закрепление.

Лично я просто сделал бы это в коде - позади , Нагруженный событие

Если они настаивают выставленный для обозрения Первый MVVM, то Представление управляет прикладным потоком, и я не вижу оснований, почему необходимо не допустить прикладную логику в код Представления - позади.

Поэтому просто установите ваш Окно. DataContext. UserControl3Vm собственность к UserControl3. DataContext в Нагруженном событии:)


    
        
    


void MyWindow_Loaded(object sender, EventArgs e)
{
    ((MainWindowVm)MyWindow.DataContext).UserControl3Vm 
        = MyUserControl.DataContext;
}
2
добавлено
@Neutrino , Нагруженный , событие должно войти в код - позади Окно , не UserControl , таким образом, это должно будет только сослаться на it' s владеют ViewModel' s тип данных. I' ll обновляют пример кода, чтобы сделать это легче видеть.
добавлено автор Rachel, источник
@AbeHeidebrecht You' право ре, которое можно использовать это вместо того, чтобы назвать Окно, хотя это. UserControl3Vm won' t работа начиная с UserControl3Vm собственность на Окно. DataContext , не Окно:)
добавлено автор Rachel, источник
Вы don' t должен назвать окно, чтобы сослаться на него в его собственном классе. Просто сделайте: это. UserControl3Vm = MyUserControl. DataContext;
добавлено автор Abe Heidebrecht, источник
Ах да, я должен был прочитать его более тесно.
добавлено автор Abe Heidebrecht, источник
That' s некоторое противное сцепление, продолжающееся там. Точка зрения UserControl должна была бы знать конкретный тип viewmodel, используемого представлением, которое принимает его. Что, если UserControl были приняты множеством различных взглядов? Это должно было бы тогда опросить тип своего представления владения, чтобы быть в состоянии назначить его viewmodel ссылку на viewmodel ее владельца.
добавлено автор Neutrino, источник
Извините, я был тускл. Да, который работает вполне прилично. Я don' t даже должен использовать Нагруженное событие, я могу сделать его правильно после звонка в InitializeComponent в конструкторе Окна.
добавлено автор Neutrino, источник
И я думаю, что вы правы относительно BindingExpression, заменяющего UserControl' s DataContext также. Так I' ll отмечают это как ответ хотя если anyone' s получил способ заставить его работать в файле XAML I' d все еще любят видеть его.
добавлено автор Neutrino, источник

Это возможно в XAML, использующем некоторую работу (взломать доступ DataContext элемента хозяина). Подход упоминается здесь. Это использует Freezables.

XAML


    
             
        
    
    
        
            
                

                
            
        
    
    
        
        
    

0
добавлено