如何在另一个项目中使用带有viewmodel的xaml

时间:2012-12-13 04:25:46

标签: events xaml mvvm viewmodel windows-phone

我有一个WP7应用程序应用程序,其中包含一个名为page1.xaml的带有viewmodel的xaml文件。 xaml文件包含带有绑定命令的按钮

我有另一个名为sampleapplication的项目,我在其中启动了一个模拟器,并且必须显示上面的page1.xaml文件,该文件位于另一个项目中。

我可以使用

从当前项目中的wp7 app加载上述xaml文件

(Application.Current.RootVisual as PhoneApplicationFrame).Navigate(new Uri(“/ WP7application; component / Views / page1.xaml”,UriKind.Relative));

但是在加载xaml之后我无法处理事件。如何在当前项目中使用该按钮?

我在当前的sampleapplication中添加了对wp7 app视图和viewmodels的所有引用

2 个答案:

答案 0 :(得分:0)

您可以轻松地在单独的程序集中查看和查看模型,但包含视图的程序集(应用程序或库)必须具有对视图模型所在的库的引用。

但有两件事需要注意:
1.如果您对视图和视图模型使用不同的程序集,则视图模型必须位于类库中,而不是主应用程序。
2.确保构造代码,以便您没有任何循环引用。 (随着复杂性的增加,这可能需要遵守纪律。)

答案 1 :(得分:0)

听起来好像您的视图的DataContext未设置为视图模型的实例。有几种方法可以做到这一点。

最简单的方法是将以下代码放在视图的Loaded事件中:

private void PhoneApplicationPage_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
    DataContext = new ViewModel();
}

首选方法是在应用程序项目中定义视图模型定位器。创建视图模型的实例。

public class ViewModelLocator
{
    private readonly ViewModel _viewModel = new ViewModel();

    public ViewModel Main
    {
        get { return _viewModel; }
    }
}

在App.XAML中创建视图模型定位器:

<Application xmlns:vm="clr-namespace:groovd.client.phone.ViewModels" >
    <Application.Resources>
        <ResourceDictionary>
            <vm:ViewModelLocator xmlns:vm="clr-namespace:MyApp.ViewModels" x:Key="Locator" />
        </ResourceDictionary>
    </Application.Resources>
</Application>

然后从页面中的视图模型定位器获取属性:

<phone:PhoneApplicationPage 
    DataContext="{Binding Main, Source={StaticResource Locator}}">
</phone:PhoneApplicationPage>