Caliburn.micro父级->子级和子级->父级互动

时间:2019-01-19 22:31:24

标签: c# mvvm parent-child caliburn.micro

我正在使用Caliburn.micro开发WPF应用程序。在这里,我有一个mainViewModel扩展了Conductor和两个subviewModels扩展了Screen。这两个视图模型由MainViewModel中的选项卡控件激活。我有属于MainViewModel的字符串,我需要对两个subViewModel进行这些字符串。我需要传递给subViewModels的字符串在MainView中绑定到文本框。我想将这些字符串传递给subViewModel,即使从MainViewModel更改了这些字符串,我也需要更新subViewModels。现在,我在每个subViewModel的构造函数中提供MainViewModel作为参数,但是我很确定有更好的方法 基本上,我想将子级属性绑定到父级属性,如果父级或子级ViewModel中的属性已更改,则报告它们中的任何一个。 你能指出我的正确方向吗?

1 个答案:

答案 0 :(得分:1)

您可以利用 EventAggregators 实现这一目标。

  

对于不熟悉的人,事件聚合器是一项提供以下服务的服务:   在一个实体中将对象从一个实体发布到另一个实体的能力   宽松的时尚。

您可以了解有关事件聚合器here

的更多信息

您首先定义您的CustomMessage,其中将包含要传递的消息。

public class CustomMessage
{
    public string String1 { get; set; }
}

现在,您进入ParentViewModel并创建事件聚合器实例。

private IEventAggregator _eventAggregator;
[ImportingConstructor]
public ShellViewModel(IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
_eventAggregator.Subscribe(this);
}

现在,在绑定到“文本框”的属性的“设置器”中,您将添加代码以使用Event Aggregator发布消息。

例如,

public string String1
{
    get => _string1;
    set
    {
        if (_string1.Equals(value)) return;

        _string1 = value;
        _eventAggregator.PublishOnUIThread(new CustomMessage
        {
            String1 = _string1,
        });

    }

}

现在,您进入子视图模型并订阅事件聚合器。

private IEventAggregator _eventAggregator;
[ImportingConstructor]
public SecondWinViewModel(IEventAggregator eventAggregator)
{
    _eventAggregator = eventAggregator;
    _eventAggregator.Subscribe(this);
}

为了订阅特定消息(在这种情况下为CustomMessage),您需要实现接口IHandle。

[Export(typeof(SecondWinViewModel))]
public class SecondWinViewModel : Screen, IHandle<CustomMessage>

该界面需要一个方法,您可以使用该方法来接收消息并在子窗口中更新所需的属性。

public void Handle(CustomMessage message)
{
    String1 = message.String1;
    NotifyOfPropertyChange(nameof(String1));
}

您可以通过在CustomMessage中添加更多属性来对多个参数执行相同的操作。同样,您可以将消息从子Vm传递到父Vm。