MVVM共享事件

时间:2016-11-20 12:51:16

标签: c# wpf

我有3个ViewModel,比方说ViewModelA,ViewModelB和ViewModelC。 每个视图模型都有一个相应的视图。

在ViewModelA中,我有一个公共事件,我正在使用它发送一些信息。

我希望ViewModelB和ViewModelC在ViewModelA的当前/正在运行的实例中订阅该事件吗?

我该怎么做? 如果一个新的ViewModelA我会有一个不同的ViewModelA实例,所以我需要一个对当前ViewModelA的引用......

注意:我没有使用MVVM Light或者其他框架(但是),因为我没有学习它们,但:) 谢谢。

3 个答案:

答案 0 :(得分:1)

如果要从ViewModelA视图创建新视图,可以将引用传递给另一个视图

<?php

    $dataNumRows = count($database_data);
    for ($i = 0; $i < $dataNumRows; $i++) {
        $rows = array_values($database_data)[$i];
        $rawID = $rows["id"];
        $rawLink = $rows["link"];
        $rawHeading = $rows["heading"];
        $rawSubmitBy = $rows["submit_by"];
        echo $rawLink;
        echo $rawID;
        echo $rawHeading;
        echo $rawSubmitBy;
        echo "******<br>";
    }
    ?>


<table style="width:40%">

    <tr>
        <td colspan="1"></td>
        <td colspan="5">up vote</td>
        <td colspan="5"></td>
    </tr>
    <tr>
        <td colspan="1"><?php echo $rawID ?></td>
        <td colspan="5"><?php echo $rawLink ?></td>
        <td colspan="5">submitted by<?php echo $rawSubmitBy ?></td>
    </tr>
    <tr>
        <td colspan="1"></td>
        <td colspan="5">down vote</td>
        <td colspan="5">view comments</td>
    </tr>
</table>

</body>
</html>

然后你需要在ViewModelB中有一个属性

var viewModelA = DataContext as ViewModelA;
var newWindow = new ViewB(viewModelA);

在你的新观点中:

public ViewModelA MyViewModelA { get; set; }

然后您可以通过MyViewModelA访问ViewModelA。

我总是这样做,到目前为止还没有看到任何问题。

答案 1 :(得分:1)

1)你可以在codeproject上实现某种简单的发布者/订阅者。您将领先一步,因为大多数框架都有类似的东西:

在MVVM灯光中,它被称为Messenger

在棱镜中有EventAggregator

2)丑陋的解决方案是在ViewModelA中创建静态事件,这样你就不需要引用了

答案 2 :(得分:1)

虽然您可以在ViewModel之间传递引用,但它会使您的应用程序紧密耦合,而不是特别可扩展。此外,如果您决定在未来进行更改,则重构的数量会迅速增加,从而使管理更改变得更加困难。

查看PubSub事件框架。这些都包含在您提到的MVVM框架中,例如PRISM或MVVM-Light,但如果您不想要或不需要上面提到的完整框架,您可以随时添加自己的版本。

请查看release notes,了解一个简单的无意义实现,您应该能够适应自己的要求。