Где и как представлениям, генерируемым ViewLocator, назначаются их DataContexts (в учебном приложении Avalonia по Todo)? - PullRequest
0 голосов
/ 30 апреля 2020

В законченном учебном приложении Todo Avalonia --- где и как TodoListView и AddItemView получают свои DataContexts равными TodoListViewModel и AddItemViewModel соответственно ???
Я имею в виду их родительский элемент управления MainConindow, DataContext является экземпляром MainWindowViewModel (как назначается в файле App.xaml.cs) --- в то время как атрибут Content в MainWindow связан со свойством Content MainWindowViewModel (которое получает назначенные экземпляры моделей представления во время выполнения). Я просто не могу отследить источник, из которого TodoListView и AddItemView получают свои DataContexts. Они получают это, пока:

  1. Создается ViewLocator во время выполнения? - но это невозможно, поскольку свойство DataContext вновь созданного экземпляра View по-прежнему равно NULL непосредственно перед тем, как ViewLocator возвращает экземпляр View - как показано в результате вывода следующего кода в завершенном приложении (код в блоке if изменяется мне произвести требуемый вывод):
public IControl Build(object data)
        {
            var name = data.GetType().FullName.Replace("ViewModel", "View");
            var type = Type.GetType(name);

            if (type != null)
            {
                var viewInstance = (Control)Activator.CreateInstance(type);

                // the following always evaluates to true --- i.e. DataContext is always NULL before viewInstance is returned.
                if(viewInstance.DataContext == null)   
Console.WriteLine($"DataContext property of the newly created View instance of {name} in ViewLocator is NULL just before returning! ");



                return  viewInstance ;
            }
            else
            {
                return new TextBlock { Text = "Not Found: " + name };
            }
        }
ИЛИ они получают свой DataContext, назначенный родительским окном? --- но собственный DataContext родительского окна - MainWindowViewModel ----- как мы можем добраться до TodoListViewModel или AddItemViewModel из MainWindowViewModel ???

Короче говоря, мне неясно, где представления, сгенерированные во время выполнения через ViewLocator, получают присвоенные им свойства DataContext.

1 Ответ

1 голос
/ 30 апреля 2020

DataContext наследуется от ContentPresenter, который запрашивает IDataTemplate.Build новый экземпляр представления. Когда Content не является элементом управления, ContentPresenter устанавливает свой собственный DataContext в значение Content, которое наследуется дочерним представлением.

ContentPresenter is используется внутренне Window для отображения его свойства Content.

То же самое происходит с ListBox элементами.

...