如何在Silverlight中使用导航服务实现MVVM?

时间:2012-05-30 16:00:59

标签: silverlight

我即将开始我的第一个silverlight项目(Silverlight 4.0)并花了一些时间研究最佳方法等。我将使用MVVM并且花了最近几天看导航。

首先,我注意到许多MVVM示例没有将MainPage实现为View / View模型。 MainPage包含导航框架和Uri映射,然后导航到遵循视图/视图模型的页面。使用MVVM和导航服务是否标准主页未实现为视图/视图模型?例如,Silverlight 4培训套件包含事件管理器示例,主页面背后有许多代码,即处理导航事件,如Navigated和NavigatedFailed。但所有其他页面都是View / View Models。

其次,使用导航服务,改变导航的逻辑现在由View完成,而不是由View Model控制(这违背了MVVM背后的一些想法)。网上的一些方法使用从ViewModel到View的消息传递,或者将导航服务传递给ViewModel并在那里控制导航。这些方法中的任何一种都比另一种更好吗?

理想情况下,我想找到一个示例,其中主页面跟随View / ViewModel,ViewModel控制导航,并且视图不受代码隐藏。我问的太多了吗?!

仅供参考我没有使用PRISM或MVVM Light。

干杯

1 个答案:

答案 0 :(得分:0)

在我的项目中,我们在MainPage中创建了一个容器,并在那里加载了每个视图。 这样我们就不需要在代码隐藏中放入任何代码。 当主页面在App上作为RootVisual启动时,MainPage将作为DataContext接收我们创建shell的类。容器从此类接收DP,我们使用shell中的事件来加载视图。

以下是容器的代码:

<ContentControl Name="region1ContentControl" Content="{Binding Path=MainContent}" Style="{StaticResource ContentControlStyle}" Grid.Row="1" Margin="0,30" />

MainContent属性:

public static readonly DependencyProperty MainContentProperty =
        DependencyProperty.Register("MainContent", typeof(System.Windows.Controls.Control),
        typeof(MainPagePresenter), null);
    public System.Windows.Controls.Control MainContent
    {
        get { return (System.Windows.Controls.Control)GetValue(MainContentProperty); }
        set { SetValue(MainContentProperty, value); }
    }

加载视图的shell +

var presenter = (Bxf.IPresenter)Bxf.Shell.Instance;

        presenter.OnShowView += (view, region) =>
        {
            if (region.Equals("MainContent", StringComparison.InvariantCultureIgnoreCase))
                MainContent = view.ViewInstance;
            else if (region.Equals("DetailContent", StringComparison.InvariantCultureIgnoreCase))
                DetailContent = view.ViewInstance;
            else
                throw new ArgumentException(string.Format(AppStrings.InvalidRegionName, region));
        };

MainPage代码隐藏:

    public partial class MainPage : UserControl
{
    public MainPage()
    {
        InitializeComponent();
    }
}
你知道吗? 注意:我也没有使用Prism或MVVM光。

相关问题