通过 MVVM 将视图输出到另一个视图到另一个视图

本文关键字:视图 另一个 输出 通过 MVVM | 更新日期: 2023-09-27 18:32:45

我是Windows Phone上MVVM集成的初学者。我有 2 个不同的视图(TilesView[xaml+cs] 和 MainPage[xaml+cs](和 2 个视图模型(MainViewModel.cs 和 TilesViewModel.cs(,然后是我的 MainPage.xaml 。我想在按下主页上的主页按钮时将磁贴视图输出到我的主页中。TilesView包含一个画布,其中包含我的Tiles。我应该在主视图中使用什么控件,以便它包含磁贴视图?我希望每当我想在按下主页中的主页按钮后将视图输出到主页时调用一个名为 LaodTiles 的函数。如何定义该函数以及在哪里定义?

我主要集成了 MVVM 结构,以便能够更好地管理我的资源并使 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>();
        }
    }
...

我的磁贴视图具有以下一般结构:

<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 弹出/加载到主页时,它将填充该网格行部分。如果保留网格空间不是解决方案或没有必要,我很高兴听到其他一些提示/解决方案。也许还有另一种方法可以在调用 TilesView 时重新定位它,就像在代码隐藏中一样。

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

通过 MVVM 将视图输出到另一个视图到另一个视图

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

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

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

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

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

不要太执着于 MVVM,它只是一种执行 3 层体系结构的更高级方法,将业务逻辑与视图逻辑与处理逻辑分离。最主要的是绑定到 VM 并在 VM 上对数据执行大部分处理,但不是直接视图逻辑,除了打开或关闭该处理的视图上绑定的数据。