带有Object Instance的XAML中的ObjectDataProvider不会在调试中调用ViewModel Constructor

时间:2014-02-03 23:33:10

标签: c# wpf xaml mvvm objectdataprovider

我们曾经在以前的工作中这样做,并且在那里工作得很完美,但由于某种原因,我现在无法让它工作。

我只想使用ObjectDataProvider在XAML中创建ViewModel类的实例,以便我可以引用它进行绑定,并且我已经将Window上的DataContext设置为ViewModel,并且我有一个xmlns :local,具有与我的所有ViewModel具有相同名称空间的完全限定名称。

<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:Type local:TimersHostViewModel}”......什么给出?!为什么它在一个实例中工作而不是另一个实例?我对此很困惑。

编辑:好的,我能够部分回答我自己的问题,但真正的问题仍然存在。 因此,我可以通过删除Window的DataContext并将ObjectDataProvider ObjectInstance更改为ObjectType来调用ViewModel构造函数。然后设置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#VS2013/TimersXP/Views/TimersHost.xaml

1 个答案:

答案 0 :(得分:0)

必须将IsAsynchronous =“True”属性添加到ObjectDataProvider,然后一切都工作得很好!感谢这个线程的抬头! http://forums.asp.net/t/1344386.aspx?How+to+create+a+flipcart+like+panel+for+showing+products+in+gridview