重用多个视图模型的视图



我想为2个不同的视图模型重用视图,在我的示例MyEntityEditViewModelMyEntityCreateViewModel中。这个视图基本上只是一个带有Save按钮的表单,所以很常见的布局。

我创建了两个视图模型以及父视图/视图模型(MyEntitySummaryViewModel),现在我想使用ContentControl定义表单视图。

摘要视图:

<ContentControl x:Name="ActiveItem" cal:View.Model="{Binding ActiveItem}" cal:View.Context="MyEntityDetailView" />

MyEntitySummaryViewModel :

public MyEntity SelectedEntity {
    get { return _selectedEntity; }
    set {
        _selectedEntity = value;
        NotifyOfPropertyChange();
        ActivateItem(new MyEntityEditViewModel(_selectedEntitity));
    }
}
public void Create() {
    ActivateItem(new MyEntityCreateViewModel(new MyEntity()));
}

我的问题是现在Caliburn试图找到一个' MyEntityEditView ',由于它的视图定位约定,即使我严格定义了ContentControl的上下文作为自定义视图。有办法解决这个问题吗?还是我做错了什么?

如果我的理解是正确的,你想要2种类型的ViewModel指向同一个视图。如果是这样,只需创建一个基类为您的实体(EntityBaseViewModel)和创建一个视图(EntityBaseView)。

要绑定ContentControl,设置他的x:Name,使其名称匹配ViewModel的属性。

的例子:

视图(ShellView):

<ContentControl x:Name="SelectedEntity"/>

视图模型(ShellViewModel):

public EntityBaseViewModel  SelectedEntity 
{
    get 
    { 
        return this._selectedEntity; 
    }
    set 
    {
        this._selectedEntity = value;
        this.NotifyOfPropertyChange(() => SelectedEntity);
    }
}

和Caliburn将找到ViewModel的视图和绑定数据文本如果你创建你的ViewModel/视图沿着命名约定,就像你说的。

有点晚了,但也许这将帮助某人。这个视频对我帮助很大- (Tim Corey, WPF和Caliburn与MVVM)

设置ShellView与一个控件,指向ActiveItem正如你提到的,允许该控件显示任何视图,你告诉它从ShellViewModel代码。我也在这个项目中使用了Fody,所以它照顾了更改通知,所以你不会看到代码中列出的那些。

ShellView——

<Button x:Name="LoadMainPage" />    
<Button x:Name="LoadSecondPage" />
<ContentControl x:Name="ActiveItem"/>

ShellViewModel -

public class ShellViewModel : Conductor<object>.Collection.OneActive
{       
        public MainPageViewModel MainPageVM = new MainPageViewModel();
        public SecondPageViewModel SecondPageVM = new SecondPageViewModel();
        public ShellViewModel()
        {           
            LoadMainPage(); // auto load main page on startup
        }
        public void LoadMainPage()
        {
            ActivateItem(MainPageVM);
        }
        public void LoadSecondPage()
        {
            ActivateItem(SecondPageVM);
        }
}

当使用ActivateItem时,不是创建ViewModel的新实例,而是重用创建的初始实例。或者,如果您确实希望在每次启动特定视图时创建另一个实例,那么只需使用您已经拥有的ActivateItem。

在你的SecondPageViewModel中的视图,它将占用ContentControl中的空间为ActiveItem -

public class SecondPageViewModel : Screen

SecondPageView。xaml作为用户控件添加(以及任何其他想要创建的子/子视图)-

<UserControl x:Class="MyNamespace.Views.SecondPageView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:MyNamespace.Views"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
    </Grid>
</UserControl>

这将允许你在基视图/视图模型的任何视图之间来回翻转,并显示你在ContentControl框中选择的子视图的内容(无论你想要多少)。

相关内容

  • 没有找到相关文章

最新更新