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