ObjectDataProvider в XAML с ObjectInstance не вызывает ViewModel Contructor при отладке
Раньше мы делали это на моей предыдущей работе, и там она работала идеально, но по какой-то причине я не могу заставить ее работать сейчас.
Я просто хочу использовать ObjectDataProvider для создания экземпляра класса ViewModel в XAML, чтобы я мог ссылаться на него для привязки, и у меня установлен DataContext в Window для ViewModel, и у меня есть xmlns: local с полное имя с тем же пространством имен, что и у всех моих ViewModels.
<Window
x:Class="TimersXP.TimersHost"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
xmlns:local="clr-namespace:TimersXP.ViewModels"
Name="TimersHostView"
SizeToContent="Height"
Title="TimersXP"
WindowStartupLocation="CenterScreen"
WindowStyle="ToolWindow"
DataContext="TimersHostViewModel">
<Window.Resources>
<ObjectDataProvider x:Key="TimersHostViewModel" ObjectInstance="{x:Type local:TimersHostViewModel}"/>
</Window.Resources>
Тогда позже моя попытка использовать ViewModel:
<Grid.ContextMenu>
<ContextMenu ItemsSource="{Binding Source={StaticResource TimersHostViewModel}, Path=Skins}" Style="{DynamicResource styleBanner}"/>
</Grid.ContextMenu>
Но моя проблема заключается в том, что когда я устанавливаю точки останова в конструкторе TimersHostViewModel без параметров, они никогда не удаляются при отладке. Таким образом, кажется, что ObjectDataProvider не выполняет свою работу правильно. Хотя окно действительно создается.
Я вижу, что точки останова в моих файлах App.xaml.cs и MainWindow.xaml.cs ударили, InitializeComponent также ударил, и даже мой класс одиночной модели создан. Но я не могу понять, почему мой конструктор класса TimersHostViewModel никогда не вызывается.
Я помню одну вещь: в моей работе мы использовали такую строку:
Я вижу, что здесь нет ObjectInstance, а есть только ObjectType, поэтому, когда я попытался удалить ObjectInstance и установить вместо него ObjectType, я получаю следующую ошибку: Ссылка на объект не установлена на экземпляр объекта, и она выделяет ObjectType="{x: Тип local:TimersHostViewModel}"... Что дает?! Почему это работает в одном случае, а не в другом? Я очень смущен этим.
РЕДАКТИРОВАТЬ: Хорошо, я смог частично ответить на свой вопрос, но реальный вопрос все еще остается. Таким образом, я смог получить конструктор ViewModel для вызова, удалив DataContext для окна и изменив ObjectDataProvider ObjectInstance на ObjectType. Затем установите Grid DataContext для привязки к TimersHostViewModel. Но это все еще оставляет меня теперь с этой ошибкой времени разработки / времени компиляции для ObjectDataProvider ObjectType: ссылка на объект не установлена на экземпляр объекта.
<Window
x:Class="TimersXP.TimersHost"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
xmlns:local="clr-namespace:TimersXP.ViewModels"
Name="TimersHostView"
SizeToContent="Height"
Title="TimersXP"
WindowStartupLocation="CenterScreen"
WindowStyle="ToolWindow">
<Window.Resources>
<ObjectDataProvider x:Key="TimersHostViewModel" ObjectType="{x:Type local:TimersHostViewModel}"/>
</Window.Resources>
<Grid DataContext="{Binding Source={StaticResource TimersHostViewModel}}">
Также все еще не уверен, почему это будет работать при одних обстоятельствах, но не в других, как тот, который я использую сейчас.
Полный исходный код здесь: http://timersxp.codeplex.com/SourceControl/latest
1 ответ
Пришлось добавить свойство IsAsynchronous="True" в ObjectDataProvider, тогда все работает просто замечательно! Спасибо этой теме за головы! http://forums.asp.net/t/1344386.aspx?How+to+create+a+flipcart+like+panel+for+showing+products+in+gridview