在“内部”用户控件上使用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, LabelText
和Text
。
然后在UserControl的XAML中,绑定到新属性。
在使用此控件的位置,您现在可以在XAML中设置LabelText和Text值。 因此,在主视图中添加控件,并将LabelText
和Text
绑定到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); } }
如果要从用户控件的父级显示或设置属性,可以创建附加属性以绑定到用户控件,即从用户控件获取/设置属性