0

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

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

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

理想情况下,我想找到一个示例,其中主页遵循 View/ViewModel 并且 ViewModel 控制导航并且视图没有后面的代码。我要求太多了吗??!

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

干杯

4

1 回答 1

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); }
    }

加载视图的外壳 +

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 灯。

于 2012-05-30T17:21:04.527 回答