c# - 将对象从父 View 传递到 MVVM 中的 subview

标签 c# wpf windows mvvm communication

我目前正在尝试进入 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/

相关文章:

c# - 寻找 WCF basicHttpBinding https 教程或示例

WPF DataGrid 更新问题

c# - 如何创建类似于 Google Images 的 WPF 布局

c# - 为什么此代码会导致 "The name does not exist in the current context"错误?

c++ - 无法在 Bash for Windows 中通过管道输出

Python 在读取和打印简单文件时卡住

c# - WPF:如何在具有延迟时间的单独线程中调用方法

c# - 如何使键盘可滚动只读 WPF 文本框?

c# - 找到两个法向量之间的 x,y,z 旋转

windows - assembly 计数程序