重用具有不同 ViewModel 的 usercontrol(View)

reuse an usercontrol(View) with different ViewModels

我将直接进入我的问题。 :)

我使用 Caliburn.Micro 和 mvvm。 16 个用户控件在我的 MainView 上。所有看起来都一样,但有些按钮、标签……就像这样:

<UserControl x:Class=" Projectxy.usercontrolexample01View"
         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:Projectxy"
         mc:Ignorable="d" 
         d:DesignHeight="200" d:DesignWidth="305"> 
<Grid>
<Button x:Name="button" Content="Button" Width="75"/>
<Label x:Name="label" Content="Label"/>
<ComboBox x:Name="comboBox"/>
</Grid>
</UserControl>

我像这样调用 MainView 中的用户控件:

<ContentControl Name=" usercontrolexample01Model" Grid.Column="2" Grid.Row="1"/>
<ContentControl Name=" usercontrolexample02Model" Grid.Column="2" Grid.Row="2"/>

(我不绘制 Bootstrapper 是因为我认为这对我的问题没有必要......?)

我想要的是不要在我的项目中添加 16 次相同的 xaml 代码:

usercontrolexample01View.xaml
usercontrolexample01ViewModel.cs

usercontrolexample02View.xaml
usercontrolexample02ViewModel.cs

…

16个xaml个文件,想换个东西都难...

我想在我的 MainView 中有 16 个视图和 16 个 ViewModel(每次我在 MainView 中重用它)但是 "behind" 16 个视图应该只是 1 个 xaml-file 应该被重用(usercontrolexampleView.xaml).

usercontrolexampleView.xaml
usercontrolexample01ViewModel.cs
usercontrolexample02ViewModel.cs
usercontrolexample03ViewModel.cs

有什么方法可以将 1 个用户控件 (xaml-file) 重新用于 Caliburn.Micro?我没有找到关于那个的文章... :((有一些标题相同,但它们有其他重点,例如 thread。) 最后我找到了一个 question 更符合我的方向....但是我怎么能用 Caliburn 来管理它呢?也许有人为我提供了一段带有解释的代码?

我希望我的问题很清楚。我只是 Whosebug、wpf 和 caliburn micro 的新手...而且不太熟悉英语...:(

感谢所有建议!

Caliburn.Micro 根据命名约定为视图模型选择视图。如果你有一个视图模型 class(它应该在 <appfolder>/ViewModels/ 子文件夹中的一个文件中并命名为 <name>ViewModel.cs),它将在中寻找一个名为 'View.xaml' 的用户控件<appfodler>/Views/ 子文件夹,如果找到,则将其用于显示视图模型。

在您的情况下,您可以在主视图模型中拥有尽可能多的特定视图模型实例,然后将它们绑定到一个 ContentControl - 每个实例都将使用相同的、一旦定义的视图,因为它们属于同一类型。

例如:假设您的视图模型名为 SubViewModel,并且您为其创建了一个名为 SubView.xaml 的视图。在主视图模型中,定义任意数量的实例,

public SubViewModel sVM1 {get;set;}
public SubViewModel sVM2 {get;set;}

(甚至制作一个 List<SubviewModel>),然后在主视图中,将它们放在您喜欢的位置,

...
<ContentControl Name="sVM1"/>
....
<ContentControl Name="sVM2"/>

然后它们将全部使用SubView.xaml显示。 (另请注意,这里还有另一个绑定约定:通过将 ContentControl 命名为与 SubViewModel 实例相同,它们会自动由 caliburn.micro 绑定)。