Silverlight MVVM将用户控件连接到viewmodels

Silverlight MVVM将用户控件连接到viewmodels,silverlight,mvvm,user-controls,binding,Silverlight,Mvvm,User Controls,Binding,我对一些可能非常简单的事情不知所措。 我确实搜索过,但费菲尔德没有找到我需要的确切答案 问题如下 我在自学silverlight MVVM。 目前我正在编写一个应用程序,它使用1个主页和2个用户控件 可以想象,有3个viewmodels 当前在我的XAML中: mainpage.xaml xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/w

我对一些可能非常简单的事情不知所措。 我确实搜索过,但费菲尔德没有找到我需要的确切答案

问题如下

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

可以想象,有3个viewmodels

当前在我的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>
我完全不知道这是什么原因,其次

如何将视图模型绑定到适当的usercontrol

我是否需要为每个usercontrol声明视图命名空间,然后像主页一样设置其datacontext


感谢您花时间阅读,我希望能够很快继续:)

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

绑定方面: 您希望将子控件绑定到主视图模型上的属性,这些属性本身就是视图模型

e、 g

然后主页绑定如下:

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

某些地方需要使用正确的数据创建视图模型。挂起父视图模型的子视图是有意义的


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

像现在这样将视图绑定到vm,然后将控件等绑定到viewmodel中的数据。因此,如果uc1是一个列表框,则将其绑定到MainPageViewModel上的客户列表。@Derek Beattie:我希望我的usercontrol使用不同的viewmodel(除非确实不可能),但它仍然无法清除我得到的错误。我甚至无法加载usercontrol:(我复制了您的示例(根据给出的详细信息猜测每个组件的内容),它编译和运行良好。您能提供更多代码/Xaml吗?“无法创建”PictureSoviewView而不是主页可能有问题,但您也没有说它是在哪里创建的。发布main和用户控件的所有xaml。@Derek Beattie&HiTech Mahic,刚刚发布了xaml。想知道是什么导致了错误,以及如何将viewmodel绑定到PictureSoviewView。如果我尝试像在mainpage.xaml中一样查找它。你是对的,我在那里犯了一个错误。我没有尝试在同一个视图中创建一个视图。对此很抱歉。另外,我希望为mainpage和picturesoverviewview创建一个单独的视图模型。它在WPF中工作正常。只是在silverlight中没有。我使用的是4.0,它们可以有自己的视图,但是如果你将它们创建为视图的静态成员,则它们可以是m每个视图建模与使用代码隐藏没有太大区别。这实际上是关于在何处挂起它们。对于简单的MVVM,将子视图模型作为属性嵌套在父视图模型中,并将子控件绑定到子视图模型。我正在尝试更新我的答案,以涵盖我们所说的内容。您可能需要检查您需要的Xaml发布了两次,因为它是同一批。啊,我知道你使用viewmodel绑定的目的了。谢谢你^^现在解决了这个错误,这样我就可以真正看到我在设计器中所做的事情。我再次更新了我的帖子。很抱歉造成混淆。啊…这就是你设置datacontext的方式。非常感谢!:)这非常有帮助。这实际上也清除了错误。顺便说一句,将您的答案标记为答案。再次感谢。最后可以继续:)我正在从内存中执行示例的绑定位,但是如果显示的任何内容不起作用,请告诉我,我会更新它。
<vw:PicturesOverviewView />
Error   1   Cannot create an instance of "PicturesOverviewView".    C:\Programming\C#\newFileUpload\newFileupload\MainPage.xaml 16  9   newFileupload
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" };
        }
    }
}
<Grid x:Name="LayoutRoot" Background="White">
    <vw:PicturesOverviewView DataContext="{Binding Path=ChildViewModel1}" />
    <vw:PicturesOverviewView DataContext="{Binding Path=ChildViewModel2}" />
</Grid>