如何使用与我的嵌套视图模型对应的嵌套视图?

时间:2015-03-22 15:29:55

标签: c# wpf xaml mvvm

我正在编写一个简单的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还是模板或其他东西?我可以转换页面,还是需要重建它?

1 个答案:

答案 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通常支持这些对象以便共享:

  • 样式和模板(从FrameworkTemplate派生的样式和类)
  • 画笔和颜色(从画笔和颜色值派生的类)
  • 动画类型,包括Storyboard
  • 转换(从GeneralTransform派生的类)
  • Matrix和Matrix3D
  • 点值
  • 某些其他与UI相关的结构,例如Thickness和CornerRadius
  • XAML内在数据类型

那么你应该怎么访问MainWindow呢?您应该将它包含在您的命名空间中,例如 - xmlns:ItemView="clr-namespace:assemblyname.ItemView.xaml"