Silverlight MVVM有线用户控制到视图模型

时间:2011-07-10 18:27:59

标签: silverlight mvvm user-controls binding

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

问题如下。

我正在教自己的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

我完全不知道造成这种情况的原因,其次是......

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

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

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

1 个答案:

答案 0 :(得分:3)

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

装订明智: 您希望将子控件绑定到主视图Model上的属性,这些属性本身就是视图模型

e.g。

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),因为听起来你可能只是希望创建在不同级别引用的单例。问题在于您希望在何处提供重用,就好像您在子视图中硬连接数据上下文一样,您无法重复使用它们。