2015-08-26 3 views
0

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

Простая установка манекена:

// shell 
internal class ShellViewModel : Conductor<IScreen>.Collection.OneActive 
{ 
    public ShellViewModel() { 
     ActivateItem(new MyTestViewModel()); 
    } 
} 

// view code-behind 
public partial class MyTestView : UserControl { 

    public MyTestView() { 
     InitializeComponent(); 
    } 

    protected override void OnInitialized(EventArgs args) { 
     var vm = DataContext as MyTestViewModel; 
     Debug.Assert(vm != null); // is always null! 
    } 

} 

Вид прибудете в корректной инициализации модель представления вызывается, и оба могут быть связаны друг с другом. Когда я привязываю свойство модели представления к элементу управления представлением, к нему можно получить доступ без проблем. Только во время инициализации DataContext вида всегда null. Что?

MVVM рамка: Caliburn.Micro

+0

Вы можете попробовать где-то после инициализации, может быть в событии Loaded пользовательского элемента управления? – Joseph

+0

Проверьте, является ли 'DataContext' пустым первым, потому что вы можете отличить' DataContext' от неправильного типа. – Oluwafemi

+0

Где и как вы устанавливаете свой datacontext для представления? –

ответ

1
public partial class MyTestView : UserControl { 

    public MyTestView() { 
     InitializeComponent(); 



    } 

    public MyTestViewModel ViewModel{ 
     return (MyTestViewModel)Datacontext; 
    } 


} 

делает это для того, что когда-либо причина Сорта перерывов идеи картины, так как в ViewModel не должна быть зашита в поле зрения. Понятно для целей тестирования, но для любого фактического использования; плохой тон.
--Edit - Я думал только о действиях, но почему-то было уже поздно и не думал о доступе к данным из вида, не получающего доступ к представлению из ViewModel.

это должно получить то, что вам нужно. Только после того, как Framework привяжет представление с помощью viewmodel (т. Е. Установлен datacontext, как только Loaded был удачен), это сработает. Если вам нужно что-то сделать, я не уверен, что еще лучше.

+0

Я действительно не думаю, что доступ к модели представления из кода представления нарушает идею MVVM, поскольку: а) код-код является частью части представления; б) код-код обычно нацелен только на интерфейс представления модель, которую представление уже делает путем привязки, и в) это только в коде, поскольку мне нужно, чтобы инструменты, специфичные для вида, не были доступны, только с разметкой, и для этого мне нужны данные модели модели, что также и то, что происходит с привязкой данных. Или я тут что-то неладно? – artganify

+0

ok ... попробуйте это, тогда ... ссылку на код выше. – mvermef

+0

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

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