C# 具有多视图、棱镜和统一的WPF

C# 具有多视图、棱镜和统一的WPF,c#,wpf,mvvm,unity-container,prism,C#,Wpf,Mvvm,Unity Container,Prism,我必须用WPF C#编写一个应用程序。我的问题是我不知道如何处理多个视图。直到知道我知道如何使用Prism连接ViewModel,以便在基本级别通过绑定进行查看。通过重写OnStartup方法和使用UnityContainer,我学会了在App.xml.cs中注册ViewModel以查看的Unity 我想知道如何从视图1导航到视图2,反之亦然。 我想通过一个按钮导航,但视图不同 你能帮帮我吗?有什么建议吗 像这样,退相干 我有一个很久以前写过的例子,它不需要任何框架废话,根据我的经验,WPF M

我必须用WPF C#编写一个应用程序。我的问题是我不知道如何处理多个视图。直到知道我知道如何使用Prism连接ViewModel,以便在基本级别通过绑定进行查看。通过重写OnStartup方法和使用UnityContainer,我学会了在App.xml.cs中注册ViewModel以查看的Unity

我想知道如何从视图1导航到视图2,反之亦然。 我想通过一个按钮导航,但视图不同

你能帮帮我吗?有什么建议吗


像这样,退相干

我有一个很久以前写过的例子,它不需要任何框架废话,根据我的经验,WPF MVVM框架在大多数情况下都是无用的,而且往往会使简单的事情复杂化。您需要的只是一个
ICommand
实现和一个
ViewModelBase
实现
inotitypropertychanged
,下面是一个简单的例子:

XML:

结果看起来像


我有一个我很久以前写的例子,它不需要任何框架废话,根据我的经验,WPF MVVM框架在大多数情况下都是无用的,而且往往会使简单的事情复杂化。您只需要一个
ICommand
实现和一个
ViewModelBase
实现
InotifyPropertyChanged
,下面是一个简单的示例:

XML:

结果看起来像


使用Prism Navigation执行此操作非常容易,而且不需要您创建对ViewModels的依赖关系,也不需要使用动态数据模板来引入性能滞后。我建议阅读有关Prism导航的文档

实际上,您使用了RequestNavigate、GoBack和GoForward的组合

这里还有一个样本供您学习:

您还应观看本课程,该课程将引导您完全了解您的问题:


使用Prism Navigation执行此操作非常容易,而且不需要您创建对ViewModels的依赖关系,也不需要使用动态数据模板来引入性能滞后。我建议阅读有关Prism导航的文档

实际上,您使用了RequestNavigate、GoBack和GoForward的组合

这里还有一个样本供您学习:

您还应观看本课程,该课程将引导您完全了解您的问题:


创建一个区域(例如
),注册导航视图(
IUnityContainer.RegisterTypeForNavigation
),然后在绑定到按钮的命令中执行导航(
RegionManager.RequestNavigate
)创建一个区域(例如
),注册导航视图(
IUnityContainer.RegisterTypeForNavigation
),然后在绑定到按钮的命令中执行导航(
RegionManager.RequestNavigate
)@Adrian抱歉,你问的是关于
wpf
,因为它在问题标签中,我不知道任何与IOS相关的事情,请编辑你的问题,询问你需要什么,然后等待相关答案,问题是wpf,而不是iphone或mobile,或者任何表明你没有使用
wpf
。谢谢.没关系。你可能有一部智能手机。我问这个问题是因为我想知道我是否可以在WPF中实现相同的行为。我将把这个页面标记为书签,以防万一。@Adrian是的,你当然可以!这就是上面的想法,你需要对上面做的唯一更改是隐藏按钮,而不是禁用按钮,如果你需要的话,请告诉我,让我知道你到底想要什么。我已经发布了一张图片。我需要单独的视图。@Adrian抱歉,你想问的是
wpf
,因为它在问题标签中,我不知道与IOS相关的任何内容,请编辑你的问题,询问你到底需要什么,然后等待相关的答案,问题是wpf,不t iphone或mobile或任何表明您没有使用
wpf
。谢谢。没关系。您可能有一部智能手机。我问这个问题是因为我想知道我是否可以在wpf中实现相同的行为。我会将此页面标记为书签,以防万一。@Adrian是的,您当然可以!这就是上面的想法,您需要对上面的内容进行的唯一更改是隐藏按钮,而不是禁用按钮,如果这是您需要的,请让我知道,让我知道您到底想要什么。我已经发布了一张图片。我需要单独的视图。
   <Window.Resources>
        <DataTemplate DataType="{x:Type local:ViewModel1}">
            <local:View1/>
        </DataTemplate>
        <DataTemplate DataType="{x:Type local:ViewModel2}">
            <local:View2/>
        </DataTemplate>
        <DataTemplate DataType="{x:Type local:ViewModel3}">
            <local:View3/>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <ContentControl Content="{Binding CurrentViewModel}">
        </ContentControl>

        <StackPanel Orientation="Horizontal" Grid.Row="1" VerticalAlignment="Bottom">
            <Button Command="{Binding PrevViewModel}">Previouws View</Button>
            <Button Command="{Binding NextViewModel}">Next View</Button>
            <Button Command="{Binding SwitchToViewModel}" CommandParameter="{x:Type local:ViewModel1}">Switch To View1</Button>
            <Button Command="{Binding SwitchToViewModel}" CommandParameter="{x:Type local:ViewModel2}">Switch To View2</Button>
            <Button Command="{Binding SwitchToViewModel}" CommandParameter="{x:Type local:ViewModel3}">Switch To View3</Button>
        </StackPanel>
    </Grid>
 public class MainViewModel : ViewModelBase
    {
        //add instances to all the ViewModels you want to switch between here, and add templates for them in your resources specifying the x:type and the view or data template to be used
        public ObservableCollection<ViewModelBase> ViewModels { get; set; } = new ObservableCollection<ViewModelBase>();

        private ViewModelBase _currentViewModel;

        public ViewModelBase CurrentViewModel {
            get { return _currentViewModel; }
            set { SetField(ref _currentViewModel, value); }
        }

        private ICommand _nextViewModel;
        public ICommand NextViewModel
        {
            get
            {
                return _nextViewModel = _nextViewModel ?? new RelayCommand(p =>
                  {
                      CurrentViewModel = ViewModels[ViewModels.IndexOf(CurrentViewModel) +1];
                  }, p =>
                  {
                      return ViewModels.IndexOf(CurrentViewModel) + 1 != ViewModels.Count && CurrentViewModel != null;
                  });
            }
        }

        public ICommand _prevViewModel;
        public ICommand PrevViewModel
        {
            get
            {
                return _prevViewModel = _prevViewModel ?? new RelayCommand(p =>
                {
                    CurrentViewModel = ViewModels[ViewModels.IndexOf(CurrentViewModel) - 1];
                }, p =>
                {
                    return ViewModels.IndexOf(CurrentViewModel) != 0 && CurrentViewModel!=null;
                });
            }
        }

        private ICommand _switchToViewModel;
        public ICommand SwitchToViewModel
        {
            get
            {
               return _switchToViewModel = _switchToViewModel ?? new RelayCommand(p =>
                {
                    CurrentViewModel = this.ViewModels.FirstOrDefault(vm=>vm.GetType()==p as Type);
                }, p =>
                {
                    return this.ViewModels.FirstOrDefault(vm => vm.GetType() != p as Type) != null;
                });
            }
        }
    }