使用不同的ViewModels重用用户控件(View)

本文关键字:控件 用户 View ViewModels | 更新日期: 2023-09-27 18:24:00

我将直接讨论我的问题。:)

我使用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"/>

(我不绘制引导程序,因为我认为这对我的问题没有必要…?)

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

usercontrolexample01View.xaml
usercontrolexample01ViewModel.cs
usercontrolexample02View.xaml
usercontrolexample02ViewModel.cs
…

如果我想更改某些内容,很难更改16个xaml文件。。。

我想要在我的MainView中有16个视图和16个ViewModels(每次我在MainView中重用它),但"在"16个视图后面应该只有1个xaml文件,应该重用(usercontrolexampleView.xml)。

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

是否有任何方法可以在Caliburn.Micro中重用1 Usercontrol(xaml文件)?我没有找到一些关于这方面的文章…:(有一些具有相同滴度,但它们有其他关注点,如本线程。)最后,我发现了一个更符合我方向的问题。。。。但我怎么能和Caliburn在一起呢?也许有人给我剪了一个代码,里面有解释?

我希望我的问题很清楚。我对stackoverflow、wpf和caliburn micro只是个新手。。。不太熟悉英语…:(

感谢您的建议!

使用不同的ViewModels重用用户控件(View)

Caliburn.Micro根据命名约定为视图模型选择视图。如果您有一个视图模型类(它应该在<appfolder>/ViewModels/子文件夹中的一个名为<name>ViewModel.cs的文件中),它将在<appfodler>/Views/子文件夹中查找名为"view.xaml"用户控件的视图,如果找到了它,则使用它来显示视图模型。

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

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

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

(或者甚至制作一个List<SubviewModel>),然后在主视图中,将它们放在你喜欢的地方,

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

则它们都将使用CCD_ 9来显示。(还要注意,这里还有另一个绑定约定:通过将ContentControl命名为与SubViewModel实例相同,它们将自动由caliburn.micro绑定)。