1

我是 Windows Phone 上 MVVM 集成的初学者。我有 2 个不同的视图( TilesView[xaml+cs] 和 MainPage[xaml+cs] )和 2 个 ViewModel(MainViewModel.cs 和 TilesViewModel.cs),然后是我的 MainPage.xaml 。当按下 MainPage 上的主页按钮时,我想将 TilesView 输出到我的 MainPage 中。TilesView 包含一个包含我的瓷砖的 Canvas。我应该在 MainView 中使用什么控件才能包含 TilesView?我希望在按下 MainPage 中的 HomeButton 后将视图输出到 MainPage 时调用一个名为 LaodTiles 的函数。我如何定义该功能以及在哪里?

我主要集成了 MVVM 结构,以便能够更好地管理我的资源并使 MainPage 尽可能轻,以便通过控制应该首先启动哪些设计组件以及应该延迟哪些设计组件来在启动我的应用程序时加载更快。Tiles 视图是我从 MainPage 中删除的,稍后加载它,关闭时它会释放一些资源。

所以我设法以这种方式在 VMLocator 中进行 MVVM 接线(如果这不是继续的方法,请纠正我):

...
public ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
        SimpleIoc.Default.Register<MainViewModel>();
        SimpleIoc.Default.Register<TilesHomeViewModel>();
    }

    public MainViewModel Main
    {
        get
        {
            return ServiceLocator.Current.GetInstance<MainViewModel>();
        }
    }

    public TilesHomeViewModel TilesVM
    {
        get
        {
            return ServiceLocator.Current.GetInstance<TilesHomeViewModel>();
        }
    }
...

我的 TilesView 具有以下一般结构:

<phone:PhoneApplicationPage x:Class="myAppName.Views.TilesHomeView" ... >
    <Grid x:Name="HomeGrid" ...>
        <Canvas x:Name="TilesCanvas" >
        ...

在我的 TilesHomeViewModel 中,我将它设置为 INotifyPropertyChanged(同样,我是 MVVM 的初学者,所以我对如何解决这个问题的理解可能不正确)。这是它的定义方式:

public class TilesHomeViewModel : INotifyPropertyChanged
{
    private string loadHomeContent;
    public string LoadHomeContent
    {
        get
        {
            return loadHomeContent;
        }
        set
        {
            loadHomeContent = value;
            NotifyPropertyChanged("LoadHomeContent");
        }
    }

    public TilesHomeViewModel()
    {

    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (null != handler)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

}

我的 MainPage.xaml 有一个定义了网格的网格。Gridrow=0 已为 TilesView 保留,因此当 TilesView 弹出/加载到 MainPage 时,它​​将填充该 gridrow 部分。如果保留网格空间不是解决方案或没有必要,我会很高兴听到其他一些提示/解决方案。也许还有另一种方法可以让 TilesView 在被调用时重新定位,就像在代码隐藏中一样。

任何指向之前提出的问题的提示、代码或教程链接都会有所帮助。谢谢

4

1 回答 1

0

我在大型 Windows Phone 应用程序(MapQuest)上工作,其他开发人员和我提出的设计理念是使用 MVVM,但只有一个视图/页面,并且只需通过设置加载所有视图(在本例中为控件)根据需要,它们的可见性对最终用户来说似乎是逐步浏览页面。

话虽如此,没有一种做事方式,你的方式可能和其他人一样有效。我建议您执行与上述类似的操作并保留一页,但继续使用多个 ViewModel,或者根据需要使用一个包含所有数据的视图模型,但交换可见视图。

至于处理视图,请在主页代码隐藏中执行此操作以打开每个视图/控件。

或者让每个控件(视图)绑定到提供视图状态的视图模型上的枚举。每个控件(您的视图)都将采用枚举返回的内容,并根据状态知道是否使自己可见。

您需要在该枚举的目标用户控件/视图上放置一个依赖属性。我建议将这些来自有用的 Silverlight Snippets的片段(别担心我已经将它们用于 Silverlight、WPF 和 WP8 代码)安装到 Visual Studio 中。您将需要为上述枚举添加带有更改处理程序的值类型依赖属性,并在更改处理程序中打开或关闭控件。

不要太沉迷于 MVVM,它只是一种更好的方式来实现将业务逻辑与视图逻辑与处理逻辑分离的 3 层架构。主要是绑定到 VM 并在 VM 上为数据做大部分处理,但不是直接视图逻辑,除了为该处理打开或关闭视图上绑定的数据。

于 2013-09-25T21:44:23.100 回答