Где и как сгенерированные ViewLocator представления получают свои DataContexts (в учебном приложении Todo от Avalonia)?

В завершенном учебнике Avalonia Todo application --- где и как TodoListView и AddItemView получают свои DataContexts, чтобы они были равны TodoListViewModel и AddItemViewModel соответственно???
Я имею в виду, что их родительский элемент управления MainWindow 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 };
            }
        }
  1. ИЛИ они получают свой DataContext, назначенный родительским окном? --- но собственный DataContext родительского окна - это MainWindowViewModel ----- как нам добраться до TodoListViewModel или AddItemViewModel из MainWindowViewModel???

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

1 ответ

Решение

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

ContentPresenterэто используется внутри самымWindow показать свой Content свойство.

То же самое происходит с ListBox Предметы.

Другие вопросы по тегам