我有3个ViewModel,比方说ViewModelA,ViewModelB和ViewModelC。 每个视图模型都有一个相应的视图。
在ViewModelA中,我有一个公共事件,我正在使用它发送一些信息。
我希望ViewModelB和ViewModelC在ViewModelA的当前/正在运行的实例中订阅该事件吗?
我该怎么做? 如果一个新的ViewModelA我会有一个不同的ViewModelA实例,所以我需要一个对当前ViewModelA的引用......
注意:我没有使用MVVM Light或者其他框架(但是),因为我没有学习它们,但:) 谢谢。
答案 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,了解一个简单的无意义实现,您应该能够适应自己的要求。