我目前正在尝试进入 WPF 和 MVVM,但我最近遇到了一个我不知道如何解决的问题。我是新手,所以如果有什么不对劲,请告诉我。
我有一个 ParentView 及其 ParentViewModel。 ParentView 包含两个 View SubViewA 和 SubViewB,它们都有自己的 ViewModel。这是我的 ParentView.xaml:
<local:ViewBase.DataContext>
<local:ParentViewModel x:Name="Model" />
</local:ViewBase.DataContext>
<Grid>
<local:SubViewA Visibility="{Binding ElementName=Model, Path=SubViewAVisibility}" />
<local:SubViewB Visibility="{Binding ElementName=Model, Path=SubViewBVisibility}" />
</Grid>
我想做什么:SubViewModelB 有一个绑定(bind)到 SubViewB 的属性。我想在 ParentViewModel 中发生某个事件时更改该属性。我想这应该通过将 SubViewModelB 中的属性绑定(bind)到 ParentViewModel 中的属性来完成,但我不太确定如何实现?我在 ParentView.xaml 中尝试了类似以下内容:
<local:SubViewB Visibility="{Binding ElementName=Model, Path=SubViewBVisibility}" SomeProperty="{Binding ElementName=Model, Path=WhatIWantThePropertyToBe}" />
但这让我无处可去。 那么我该如何解决呢?我知道我可以通过 MVVM light 工具包中的消息传递来完成它,但这似乎有点不适合我正在尝试做的事情。有什么建议吗?
谢谢
最佳答案
听起来像是一个很好的解决方案 EventAggregator图案。那里有一些很棒的实现,例如 Microsoft Prism 提供的实现。或 TinyMessenger (非常轻巧)
作为代码示例,您将执行类似的操作(使用 Prism,未经测试的代码)
public class ParentViewModel
{
private IEventAggregator eventAggregator;
public ParentViewModel(IEventAggregator eventAggregator)
{
this.eventAggregator = eventAggregator;
}
public void PublishSomeEvent()
{
// When a condition occurs, publish an event any subscribers
// that may be listening
this.eventAggregator.GetEvent<SomeEvent>()
.Publish(new SomeEvent("Hello World!")));
}
}
public class SubViewModel
{
private IEventAggregator eventAggregator;
public SubViewModel(IEventAggregator eventAggregator)
{
eventAggregator.GetEvent<SomeEvent>.SomeEvent(OnSomeEventOccurred);
}
public void OnSomeEventOccurred(SomeEvent arg)
{
// This method called when ParentViewModel publishes the event
Console.WriteLine(arg.OptionalMessage);
}
}
您需要单独声明事件。例如,我使用这个
public SomeEvent : CompositePresentationEvent<SomeEvent>
{
public SomeEvent(string optionalMessage)
{
this.optionalMessage = optionalMessage;
}
public string OptionalMessage { get { return optionalMessage; } }
}
关于c# - 将对象从父 View 传递到 MVVM 中的 subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10784127/