C# 具有多视图、棱镜和统一的WPF
我必须用WPF C#编写一个应用程序。我的问题是我不知道如何处理多个视图。直到知道我知道如何使用Prism连接ViewModel,以便在基本级别通过绑定进行查看。通过重写OnStartup方法和使用UnityContainer,我学会了在App.xml.cs中注册ViewModel以查看的Unity 我想知道如何从视图1导航到视图2,反之亦然。 我想通过一个按钮导航,但视图不同 你能帮帮我吗?有什么建议吗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 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;
});
}
}
}