我即将开始我的第一个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。
干杯
答案 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光。