wpf - 在Caliburn.micro中切换 View 模型/ View 的简单方法

标签 wpf mvvm caliburn.micro

几天前,我问this question,但是答案让我更加困惑。所以我会问一个简单的问题:

(我正在使用Caliburn.Micro,这是WPF应用程序)。假设您有一个MainView/MainViewModel,它作为子级AView/AViewModel和BView/BViewModel。您的MainView是一个网格,并且要根据用户选择使用AView或BView填充一个单元格。如果我只想显示AView,请执行以下操作:

在MainView中:

<StackPanel Name="SP_Controls" VerticalAlignment="Bottom" Grid.Row="1" Grid.Column="0">
    <ContentControl Name="ViewModelToShow" Margin="10" />
</StackPanel> 

并在MainViewModel中:
public AViewModel ViewModelToShow{get; set;}

我现在的天真想法是做这样的事情:
private AViewModel _AVM;
private BViewModel _BVM;

public ... ViewModelToShow{ get; set;}

然后在代码中,例如,将viewmodel设置为显示:
ViewModelToShow = _BVM; 

我唯一的问题是“...”,因为每个ViewModel属于不同的类。有没有办法用泛型来做到这一点,还是应该为我将ViewModels转换为基类的基类定义一个基类?但是,如果我这样做,它们是否仍会正确显示。谢谢。

最佳答案

您查看的模型应继承自PropertyChangedBaseScreenScreen继承自PropertyChangedBase,并实现IScreenScreen增加了生命周期(即OnActivate等)。

然后,您可以使用自己的方法,即拥有一个名为例如CurrentViewModel类型为IScreen。然后,可以根据需要将其设置为适当的 View 模型。请注意,如果要正确更新用户界面,则当引用更改时,此CurrentViewModel属性应在 setter 中调用NotifyOfPropertyChange

另外,您可以将父 View 模型视为两个 subview 模型的导体,并使用内置的Caliburn.Micro Conductor类型。例如,从Conductor<IScreen>.Collection.OneActive派生。

然后,您可以将2个 subview 模型添加到父 View 的Items集合中,并调用ActivateItem方法来设置当前 View 模型。然后将 View 的ContentControl更新为x:NameActiveItem

有关更多信息,请参见here

关于wpf - 在Caliburn.micro中切换 View 模型/ View 的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13197076/

相关文章:

wpf - 清除 ObservableCollection 时,e.OldItems 中没有项目

c# - 如何复制包含溢出内容的 FrameworkElement?

c# - WPF从DataTrigger更改图像

silverlight - MVVMLight Messenger无法发送空消息

wpf - MVVM 是否违反了 DRY?

c# - ObservableCollection.SetItem() 由于其保护级别而无法访问

wpf - 如何设置对话框位置显示在应用程序的中心?

mvvm - 如何使用 Caliburn.Micro 将源 MediaCapture 绑定(bind)到 CaptureElement?

c# - 使用 Caliburn.Micro 从 ViewModel 调用 UserControl 的方法

c# - Caliburn micro 在使用 mef 时找不到 MainView