代码之家  ›  专栏  ›  技术社区  ›  Bigeyes

将数据传递给父视图--视图之间的通信

  •  0
  • Bigeyes  · 技术社区  · 6 年前

    我创建了一个具有 GridView 和a Button . 我叫它 a parent view . 在开始时 ItemsSource 集合 网格视图 为空。现在,我单击按钮弹出一个模式/弹出视图,我将其称为 Child view .

    在子视图中有几个按钮。其中之一是为父视图创建新记录。

    例如,如果单击它,将生成一个新行数据。

    现在我的问题是如何将刚刚创建的数据发送回父视图,以便 网格视图 在父视图中是否可以刷新?

    2 回复  |  直到 6 年前
        1
  •  0
  •   Rickless    6 年前

    您可以使用 IEventAggregator 用于在两者之间通信的服务 views 创建事件,在父视图或父视图中订阅它 ViewModel ,并将其发布到子视图或子视图中 视图模型 . 这样,两个视图之间就没有显式的依赖关系。 您的记录模型类:

    public class RecordModel
    {
        //Some Properties
    }
    

    声明事件:

    public class RecordAdded : PubSubEvent<RecordModel>
    {
    
    }
    

    在父视图/视图模型中:

    eventAggregator.GetEvent<RecordAdded>().Subscribe(OnRecordAdded);
    private void OnRecordAdded(RecordModel e)
    {
    
    }
    

    在子视图/视图模型中:

    eventAggregator.GetEvent<RecordAdded>().Publish(new RecordModel
    {
        //The popup data
    });
    
        2
  •  0
  •   Haukinger    6 年前

    我想您的视图模型将完成所有工作。如果是这样的话,你可以在他们之间进行很多交流,最明显的是通过 IEventAggregator . 或者,创建一个服务作为父视图的数据源,并为其提供一个指向子视图的iterface,该子视图公开 CreateItem 功能。。。要使服务通知新项目的父视图,可以 ObservableCollection , INotifyPropertyChanged , IEventAggregator公司 或者很简单。Net事件,仅举几个例子。

    IEventAggregator公司 例子:

    internal class ChildViewModel
    {
        public ChildViewModel( IEventAggregator eventAggregator )
        {
            CreateItemCommand = new DelegateCommand( () => eventAggregator.GetEvent<ItemCreatedEvent>().Publish( new Item() ) );
        }
    }
    
    internal class ParentViewModel
    {
        public ParentViewModel( IEventAggregator eventAggregator )
        {
            eventAggregator.GetEvent<ItemCreatedEvent>().Subscribe( x => UpdateData( x ) );
        }
    }