Где и как сгенерированные 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. У них это получается, пока:
- Создается 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 ответ
DataContext
унаследовано от ContentPresenter
который спрашивает IDataTemplate.Build
для нового экземпляра представления. когдаContent
не контроль, ContentPresenter
устанавливает свои собственные DataContext
к стоимости Content
который наследуется дочерним представлением.
ContentPresenter
это используется внутри самымWindow
показать свой Content
свойство.
То же самое происходит с ListBox
Предметы.