WPF:如何使视图动态化?

我有以下xaml:需要什么才能在运行时动态填充以下xaml,但是如何? MainWorkspaceViewModel具有名为“View”的属性。 此属性是object类型,因此我可以设置其中的每个视图。

     

最小的是添加一个上下文,其中包含视图和属性更新的更改。

从代码中的其他位置,您可以通过设置新视图来管理显示的视图。

这是一个简单的实现,缺少您可能想要添加的检查。

 class MainWorkspaceViewModel : INotifyPropertyChanged { private object _view; public object View { get { return _view; } set { _view = value; OnPropertyChanged(); } } public event PropertyChangedEventHandler PropertyChanged = delegate { }; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } internal class MyViewManager { internal static MainWorkspaceView MakeMainView() { var view = new MainWorkspaceView(); view.DataContext = new MainWorkspaceViewModel(); return view; } internal static void UpdateView(MainWorkspaceViewModel viewmodel, object _next) { viewmodel.View = _next; } internal static void UpdateView(MainWorkspaceView view, object _next) { (view.DataContext as MainWorkspaceViewModel).View = _next; } } 

有无数种方法可以做到这一点。 首先,您必须确定是否正在使用任何为您执行此操作的工具包。 在确定之后,只需检查此工具包的设置方式以及如何使用它。

有一个非常简单的方法可以在没有任何工具包的情况下执行此操作并且我将向您展示,以便您了解它是如何工作的。

请注意我的例子是如何从一个新的创建,它可能不是你的情况,但它只是理解(随意创建一个新的,看看它是如何工作的)


首先创建一个实现INotifyPropertyChanged的ViewModelBase,最好使这个抽象类ViewModelBase类

 public abstract class ViewModelBase : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } public virtual ICommand NavigateCommand => new RelayCommand(Navigate); protected virtual void Navigate(object param) { } } 

然后创建你的MainViewModel,让它inheritanceViewModelBase,并为它创建一个属性,为它分配它的ViewModel

 public class MainViewModel: ViewModelBase { private ViewModelBase _currentViewModel; public ViewModelBase CurrentViewModel { get => _currentViewModel; set { if (_currentViewModel == value) return; _currentViewModel = value; OnPropertyChanged(nameof(CurrentViewModel)); } } public MainViewModel() { } protected override void Navigate(object args) { var namespaceName = "YourNameSpace."; var className = args.ToString(); var fullClassName = string.Concat(namespaceName, (string)className); if (string.IsNullOrEmpty(fullClassName)) return; var tipo = Type.GetType(fullClassName); if (tipo == null) return; var myObj = Activator.CreateInstance(tipo) as ViewModelBase; if (myObj != null) CurrentViewModel = (ViewModelBase)myObj; } } 

你应该注意到MainViewModel有一个ViewModelBase (Navigate)的重写方法,这个方法将用于从一个简单的参数打开其他ViewModels,一个名为ViewModel的字符串打开

现在,您将在MainWindow添加您的内容,在我的示例中,菜单以及将使用ViewModels填充的内容

   .....   .......    .....  

创建您的视图。 例:

                           

现在在app.xaml文件中,让我们说哪个ViewModel属于哪个UserControl

            

要从另一个视图打开视图,请使用以下命令:

  

编辑 :我忘了说,你的ViewModel必须至少有一个构造函数(空),所以没有问题发生