在“内部”用户控件上使用Caliburn.Micro绑定function

我对Caliburn.Micro很新,所以我想这有一个简单的答案(或者至少我希望它有:))

我有一个ViewModel,它有一个名为ConnectedSystem的属性,它有一个名为Name的子属性。

在我的视图中,我有以下XAML(摘录):

   

这很好用,名称按预期显示在TextBlock中。 但是,ConnectedSystem有大约10个应该显示的属性,我不想在我的视图中将XAML复制粘贴10次以上。 相反,我想将XAML提取为UserControl,我可以将LabelText和Text设置为属性。

我尝试过这个,但我不确定如何让Caliburn.Micro自动将ConnectedSystem_Name传递给我的UserControl。

这也许比在这里使用UserControl更好,所以问题基本上是:将这个共享XAML作为它自己的控件放置的最佳方法是什么,并且仍然能够使用Caliburn.Micros绑定。

Caliburn.Micro不能很好地将多个项目自动链接到单个控件。 但是,您不必依赖自动绑定器,而是可以使用普通的旧wpf绑定。

UserControl是这里的方式。 在代码中,您可以添加两个DependencyProperties, LabelTextText

然后在UserControl的XAML中,绑定到新属性。

在使用此控件的位置,您现在可以在XAML中设置LabelText和Text值。 因此,在主视图中添加控件,并将LabelTextText绑定到ViewModel中的属性。

您需要做的是在主视图中使用ContentControl来显示主视图模型的ConnectedSystem属性。 通过使用ContentControl您将包含在视图模型绑定过程中,并将应用视图模型绑定器规则。 因此,您希望您的属性(使用Caliburn的默认实现)为ConnectedSystemViewModel类型,并具有名为ConnectedSystemView的视图。 然后在用于显示父级的视图中,您希望ContentControl具有x:Name ConnectedSystem的名称(ConnectedSystemViewModel属性的名称。这将导致视图模型绑定器连接两者并执行其常规工作。以下是一些代码明晰:

ConnectedSystemView.xaml(约定ContentControl作为控件显示主视图模型的连接系统属性时约定将使用的用户控件)

             PropertyTwo Label:     

ConnectedSystemViewModel.cs(主视图模型上ConnectedSystem属性的类型)

 namespace Sample.ViewModels { public class ConnectedSystemViewModel : PropertyChangedBase { private string _propertyOne; public string PropertyOne { get { return _propertyOne; } set { _propertyOne = value; NotifyOfPropertyChange(() => PropertyOne); } } // these all need to be as above with NotifyPropertyChange, // omitted for brevity. public string PropertyTwo { get; set;} public string PropertyThree { get; set;} public string PropertyFour { get; set;} public string PropertyFive { get; set;} public string PropertySix { get; set;} public string PropertySeven { get; set;} public string PropertyEight { get; set;} public string PropertyNine { get; set;} public string PropertyTen { get; set;} } } 

在主视图中定义一个相对于ConnectedSystemViewModel类型的主视图模型属性命名的ContentControl

  

如果我理解你正确的问题,这应该是你需要挂钩到默认的Caliburn.Micro约定。 显然,您将向ConnectedSystem添加10个ConnectedSystem属性,并使用适当的名称向ConnectedSystemView添加适当的控件以完成实现。

这样,在主视图中,您只需要定义一个ContentControl来显示ConnectedSytem属性(而不是10个相同的自定义用户控件),约定将确定用于填充ContentControl的用户控件的类型。

ConnectedSystemView ,将通过约定插入主视图ContentControl的content属性,您可以使用要显示10个已连接系统属性的控件。

如果您只想显示或设置属性,我的方法是这样的:

 public String ConnectedSystemName { get { return _connectedSystem.Name; } set { _connectedSystem.Name = value; NotifyOfPropertyChange(() => _connectedSystem.Name); } } 

如果要从用户控件的父级显示或设置属性,可以创建附加属性以绑定到用户控件,即从用户控件获取/设置属性