C# 使用Caliburn.Micro绑定功能;“内部”;用户控制

C# 使用Caliburn.Micro绑定功能;“内部”;用户控制,c#,.net,user-controls,caliburn.micro,C#,.net,User Controls,Caliburn.micro,我是Caliburn.Micro的新手,所以我想这有一个简单的答案(或者至少我希望是:)) 我有一个ViewModel,其属性名为ConnectedSystem,其子属性名为Name 在我看来,我有以下XAML(摘录): 这很好,名称如预期的那样显示在TextBlock中。然而,ConnectedSystem有大约10个应该显示的属性,我不想在视图中复制粘贴XAML 10次以上。相反,我想将该XAML提取为一个UserControl,在这里我可以将LabelText和Text设置为属性 我尝

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

我有一个ViewModel,其属性名为
ConnectedSystem
,其子属性名为
Name

在我看来,我有以下XAML(摘录):


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

我尝试过这个,但我不确定如何让Caliburn.Micro自动将ConnectedSystem_名称传递到我的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
作为显示主视图模型的已连接系统属性的控件时,约定将使用的用户控件)

并在主视图中定义一个相对于类型为
ConnectedSystemViewModel

<ContentControl x:Name="ConnectedSystem"></ContentControl>

如果我没有弄错您的问题,那么您只需将其挂接到默认的Caliburn.Micro约定中即可。显然,您将向
ConnectedSystemView模型添加10个
ConnectedSystem
属性,并向
ConnectedSystemView
添加具有适当名称的适当控件,以完成实现。

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


在将通过约定插入到主视图内容属性的
ConnectedSystemView
中,您拥有要显示10个已连接系统属性的控件。

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

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

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

Cameron:我尝试了这一点,并在主视图中将文本设置为
{Binding ConnectedSystem\u Name}
,但我想这是WPF BindSign无法理解的。我应该如何以正确的方式编写此绑定?
{binding ConnectedSystem.Name}
Cameron:很明显,实际上很惭愧。非常感谢。现在效果很好。Cameron:实际上,它不起作用:(.我有下面的代码可以工作。
,但是下面给出了一个空白文本:
。但是
按预期显示文本。有什么想法吗?啊调试绑定的乐趣。确保用户控件中的绑定是双向的。这实际上不是我想要的。我想在父v中添加suer控件10次视图。不向用户控件添加10个属性。因为用户控件每次都应使用不同的参数添加到父视图中。例如
。我需要它,因为它现在在我的主窗体中有10个相同的标记块(除了名称和说明),我想用10行替换它们(对用户控件的10次调用)。但我感谢您的尝试,如果您有其他建议,我很乐意尝试:)@Øyfind但是你不是在寻找一种方法来显示其他虚拟机的
ConnectedSystem
类型的属性吗?为什么要添加10个用户控件实例来显示虚拟机的单个
ConnectedSystem
属性?我有一个对象,它有10个不同的属性,应该用自己的标签显示,并且在同一个位置方法。因此,我想对每个属性使用此用户控件一次,并将它们的输出格式化为相同的方式。这10个属性将是主视图显示的项目的不同方面。@Øyvind Hmmm我肯定缺少一些内容。我创建了一个小测试项目,适用于这种情况(据我所知)。我做了一些编辑,试图澄清我的方法。或者这是
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;}
    }
}
<ContentControl x:Name="ConnectedSystem"></ContentControl>
public String ConnectedSystemName
{
    get { return _connectedSystem.Name; }
    set
    {
        _connectedSystem.Name = value;
        NotifyOfPropertyChange(() => _connectedSystem.Name);
    }
}