【问题标题】:Silverlight MVVM wire usercontrols to viewmodelsSilverlight MVVM 将用户控件连接到 viewmodel
【发布时间】:2011-10-02 08:23:45
【问题描述】:

我对可能非常简单的事情感到茫然。 我进行了搜索,但未能找到我需要的确切答案。

问题如下。

我正在自学 Silverlight MVVM。 目前我正在编写一个使用 1 个主页和 2 个用户控件的应用程序。

您可以想象,3 个视图模型。

目前在我的 XAML 中:

mainpage.xaml

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:newFileupload.ViewModel"
xmlns:vw="clr-namespace:newFileupload.View"

<UserControl.DataContext>
    <vm:MainPageViewModel />
</UserControl.DataContext>

<Grid x:Name="LayoutRoot" Background="White">
    <vw:PicturesOverviewView />
</Grid>

PicturesOverviewView.xaml

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

<Grid x:Name="LayoutRoot" Background="White">

</Grid>

所以在 mainpage.xaml 中,我在 xaml 中设置了 datacontext,然后我像这样在网格中调用 usercontrol:

<vw:PicturesOverviewView />

这给了我以下错误:

Error   1   Cannot create an instance of "PicturesOverviewView".    C:\Programming\C#\newFileUpload\newFileupload\MainPage.xaml 16  9   newFileupload

我完全不知道是什么原因造成的,其次..

如何将视图模型绑定到适当的用户控件?

我是否需要为每个用户控件声明视图命名空间,然后像主页一样设置其数据上下文?

感谢您抽出宝贵时间阅读,我希望能够尽快继续:)

【问题讨论】:

  • 像你一样将视图绑定到虚拟机,然后将控件等绑定到视图模型中的数据。因此,如果 uc1 是 ListBox,则将其绑定到 MainPageViewModel 上的客户列表。
  • @Derek Beattie :我想要一个不同的视图模型为我的用户控件(除非真的不可能),它仍然没有清除我得到的错误。我什至无法加载用户控件:(
  • 我复制了您的示例(根据给出的详细信息猜测每个组件的内容),它编译并运行良好。你能提供更多你的代码/Xaml 吗? “无法创建”可能是 PicturesOverviewView 的问题,而不是主页的问题,但你也没有说它是在哪里创建的。
  • 发布主控件和用户控件的所有 xaml。
  • @Derek Beattie & HiTech Mahic,刚刚发布了 xaml。想知道导致错误的原因,以及如何将视图模型绑定到 PicturesOverviewView。如果我尝试像在 mainpage.xaml 中那样绑定它,它会产生另一个错误。

标签: silverlight mvvm user-controls binding


【解决方案1】:

如果显示的代码是正确的,您正在尝试在 PicturesOverviewView 控件中创建 PicturesOverviewView 控件。这将解释编译错误。 (我猜你已经剪切并粘贴了两次相同的 Xaml)。

绑定方式: 您想将子控件绑定到主视图模型上的属性,它们本身就是视图模型

例如

namespace newFileupload.ViewModel
{
    public class MainPageViewModel
    {
        public ChildViewModel1 ChildViewModel1 { get; set; }
        public ChildViewModel2 ChildViewModel2 { get; set; }

        public MainPageViewModel()
        {
            this.ChildViewModel1 = new ChildViewModel1() { SomeProperty = "hello"};
            this.ChildViewModel2 = new ChildViewModel2() { SomeProperty = "there" };
        }
    }
}

然后MainPage这样绑定:

<Grid x:Name="LayoutRoot" Background="White">
    <vw:PicturesOverviewView DataContext="{Binding Path=ChildViewModel1}" />
    <vw:PicturesOverviewView DataContext="{Binding Path=ChildViewModel2}" />
</Grid>

某处需要使用正确的数据创建视图模型。将孩子从父视图模型中挂起是有意义的。

我建议您考虑使用 IOC 注入(例如使用 Unity),因为听起来您可能只是希望创建在各个级别引用的单例。问题是你想在哪里提供重用,就好像你在子视图中硬连线数据上下文一样,你不能重用它们。

【讨论】:

  • 你是对的,我在那里犯了一个错误。我不想在同一个视图中创建一个视图。对于那个很抱歉。另外,我想要一个用于主页和图片概览的单独视图模型。它在 WPF 中运行良好。只是不在银光中。我正在使用 4.0
  • 它们可以有自己的,但是如果你将每个都创建为每个视图的视图模型的静态成员,那么与使用后面的代码没有什么不同。这真的是关于把它们挂在哪里。对于简单的 MVVM,将子视图模型嵌套在父视图模型中作为属性,并将子控件绑定到子视图模型。在我们发言时,我正在尝试更新我的答案以涵盖这一点。您可能需要检查您发布的 Xaml,因为它是同一批次的两次。
  • 啊,我知道你使用 viewmodel 绑定了。感谢 ^^ 现在解决错误,这样我就可以真正看到我在设计器中做了什么。我再次更新了我的帖子。很抱歉造成混乱。
  • Aaah... 这就是您设置数据上下文的方式。多谢! :) 这非常有帮助。顺便说一句,这实际上也清除了错误。将您的答案标记为答案。再次感谢。终于可以继续了:)
  • 我正在从内存中对我的示例进行绑定,但如果显示的任何内容都不起作用,请告诉我,我会更新它。
猜你喜欢
  • 2010-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 2023-03-27
  • 2011-07-03
  • 2013-07-04
相关资源
最近更新 更多