ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c#-将对象从父视图传递到MVVM中的子视图

2019-11-01 08:04:19  阅读:229  来源: 互联网

标签:communication wpf windows c mvvm


我目前正在尝试使用WPF和MVVM,但最近遇到了一个我不知道如何解决的问题.我对此并不陌生,所以如果事情不应该如此,请告诉我.

我有一个ParentView及其ParentViewModel. ParentView拥有两个视图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具有绑定到SubViewB的属性.我想在ParentViewModel中发生某个事件时更改该属性.我想应该通过将SubViewModelB中的属性绑定到ParentViewModel中的属性来完成,但是我不确定如何?我在ParentView.xaml中尝试了以下内容:

<local:SubViewB Visibility="{Binding ElementName=Model, Path=SubViewBVisibility}" SomeProperty="{Binding ElementName=Model, Path=WhatIWantThePropertyToBe}" />

但这使我无处可去.
那么我该如何解决呢?我知道我可以通过MVVM light工具包中的消息传递来完成此操作,但这似乎与我要执行的操作不适当.有什么建议么?

谢谢

解决方法:

听起来像是解决EventAggregator模式的好方法.有一些很棒的实现,例如Microsoft PrismTinyMessenger提供的实现(非常轻巧)

作为一个代码示例,您将执行以下操作(使用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; } } 
}

标签:communication,wpf,windows,c,mvvm
来源: https://codeday.me/bug/20191101/1982428.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有