我正在编写一个简单的Windows应用商店应用,并尝试使用MVVM。我有一个包含一堆属性的ItemViewModel和一个显示它的ItemView.xaml。我有一个MainViewModel,它包含一个名为CurrentItem的ItemViewModel属性。我有一个MainView.xaml来显示MainViewModel,但我不知道如何在其中使用ItemView.xaml。
我发现我可以将它包含在这样的资源中:
<Page.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="local:ItemView.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Page.Resources>
然后我可以像这样使用它的实例:
<StackPanel>
...other stuff using other properties of MainVM...
<local:ItemView></local:ItemView>
</StackPanel>
但我无法弄清楚如何将此ItemView绑定到CurrentItem属性。我怎么做?或者有更好的方法来构建它吗?
按建议绑定到DataContext在设计模式下工作。但是当我运行它时,主页面将无法加载,我收到此错误:
Test.exe中出现“Windows.UI.Xaml.Markup.XamlParseException”类型的第一次机会异常
WinRT信息:无法分配给属性'Windows.UI.Xaml.ResourceDictionary.Source'。
在我放置该资源声明之前,主页面加载正常,如果我将其设置为起始页面,则内部页面加载正常。所以我仍然质疑我的方法是否正确。我可以将一个独立页面声明为另一个页面中的资源吗?或者内部需要是UserControl还是模板或其他东西?我可以转换页面,还是需要重建它?
答案 0 :(得分:1)
您只是在视图中创建<ItemView/>
的实例,我没有看到您将ViewModel Property CurrentItem
绑定到<ItemView/>
。像
<local:ItemView DataContext='{Binding CurrentItem}'></local:ItemView>
可能是绑定结构可能会根据您将MainView与MainViewModel绑定的方式而改变。但它应该只对ItemView的正确viewmodel属性进行绑定。
修改强>
我错过了你问题的另一部分。是否可以将usercontrol(在本例中为ItemView
)用作资源字典项。答案是否。参考 - https://msdn.microsoft.com/en-us/library/hh968442.aspx
ResourceDictionary和Windows运行时XAML通常支持这些对象以便共享:
那么你应该怎么访问MainWindow呢?您应该将它包含在您的命名空间中,例如 -
xmlns:ItemView="clr-namespace:assemblyname.ItemView.xaml"