首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >主视图模型与用户控制视图模型之间的通信

主视图模型与用户控制视图模型之间的通信
EN

Stack Overflow用户
提问于 2020-07-09 08:53:30
回答 1查看 358关注 0票数 0

我有一个主要的视图模型,它加载一些用户控件(稳定性,坦克)根据一些情况。这些用户控件具有像StabilityVM、TankVM这样的视图模型。我的问题是如何将数据从主视图模型发送到用户控制视图模型,反之亦然。我的main.xaml及其视图模型如下所示

主窗口xaml部件

代码语言:javascript
复制
<ContentControl  Grid.Row="1" Content="{Binding 
ActiveUserControl,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
        <ContentControl.Resources>
            <DataTemplate DataType="{x:Type vm:TankVM}">
                <uc:Tank></uc:Tank>
            </DataTemplate>
            <DataTemplate DataType="{x:Type vm:StabilityVM}">
                <uc:Stability></uc:Stability>
            </DataTemplate>
        </ContentControl.Resources>

    </ContentControl>

主视图模型部件

代码语言:javascript
复制
public class MainVM : INotifyPropertyChanged
{
    Stability stability;
    Tank tank;
    WeightItem weightItem;
  
    public List<Grid> myControls = new List<Grid>();
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }


    private UserControl activeUserControl;

    public UserControl ActiveUserControl
    {
        get { return activeUserControl; }
        set { activeUserControl = value;
            OnPropertyChanged(nameof(ActiveUserControl));
        }
    }

    public MainVM()
    {
        //First user control class
        stability = new Stability();
        stability.Visibility = Visibility.Visible;
        //Second user control class
        tank = new Tank();
        tank.Visibility = Visibility.Visible;

        ActiveUserControl = stability;
        ActiveUserControl.Visibility = Visibility.Visible;
        
    }
}
EN

回答 1

Stack Overflow用户

发布于 2020-07-09 09:29:37

要在视图模型之间进行通信,可以使用中介模式。许多WPF应用程序框架(如Caliburn.Micro棱镜 )提供了这种模式的具体实现,因此您不必自己实现它。它们都提供了所谓的事件聚合器,用于通过松散耦合的事件进行通信。

例如,在Prism中,您将定义带有或不带事件参数的事件类型。

代码语言:javascript
复制
// Events derive from PubSubEvent or PubSubEvent<T> if you use event aruments
public class TankChangedEvent : PubSubEvent<TankChangedEventArgs>
{
}

// Event arguments for the above event, uses a property to capture the changed tank
public class TankChangedEventArgs
{
    public Tank Tank { get; }

    TankChangedEventArgs(Tank tank)
    {
        Tank = tank;
    }
}

然后,在发送方视图模型中,使用事件聚合器发布事件。注意,您需要创建或注入事件聚合器的实例eventAggregator

代码语言:javascript
复制
var args = new TankChangedEventArgs(changedTank);
eventAggregator.GetEvent<PartsDeletedEvent>().Publish(args);

在接收视图模型中,您需要订阅事件,例如在构造函数中。

代码语言:javascript
复制
eventAggregator.GetEvent<LogicalDirectoriesChangedEvent>().Subscribe(OnTankChanged);

创建一个方法OnTankChanged来处理接收到的事件。

代码语言:javascript
复制
private void OnLogicalDirectoriesChanged(TankChangedEventArgs args)
{
    // Do something with the event arguments
}

您可以详细阅读这里的相关内容。有关杯标微中的一个例子,请参阅本站。尽管这些机制构建在相应的框架中,但您也可以在项目中使用它们,而无需迁移整个应用程序。然而,还有其他的实现,但是这些框架是一个很好的起点,因为它们有关于这个主题的全面文档。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62811067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档