- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
让我们定义:
TabViewModel
类 TabView
类我有 n 个 TabView
类实例,所以有 n 个 TabViewModel
实例。当 TabView
类的一个实例发送一条消息时,我希望它被它自己的 View 模型接收,并且只有这个。
据我了解 mvvm light 工具包的 Messenger,我会使用类似的东西:
// in the view
Messenger.Default.Send(new RefreshMessage(/*...*/), oneToken);
和
// in the viewmodel
Messenger.Default.Register<RefreshMessage>(this, oneToken, MyViewModelMethod);
我应该为 oneToken
使用什么?
我的第一个想法是使用 ViewModel 实例作为 token :
// in the view
Messenger.Default.Send(new RefreshMessage(/*...*/), this.DataContext);
和
// in the viewmodel
Messenger.Default.Register<RefreshMessage>(this, **this**, MyViewModelMethod);
这对我来说似乎是“mvvm 友好的”,因为 View 不知道什么是 DataContext。但是使用这个解决方案,我担心内存泄漏:在 mvvm light 中,收件人是弱引用的,但 token 不是(正如您将在 WeakActionAndToken struct of the Messenger class 中看到的那样。
我可以使用什么作为 token ? viewmodel 实例是否是一个好的选择,如果使用它如何防止内存泄漏?
选项 1(基于道德逻辑答案):
选项 2(我采用的那个):
使用viewmodel实例作为Token。
为了防止内存泄漏,我们必须将它封装在一个weakReference中。为了与比较 2 个标记的 Messenger 一起工作,weakReference 应该实现 Equals
方法(这不是 WeakReference
的默认 .Net 实现的情况)类)。
所以我们有:
// in the view
Messenger.Default.Send(new RefreshMessage(), new EquatableWeakReference(this.DataContext));
和
// in the viewmodel
Messenger.Default.Register<RefreshMessage>(this, new EquatableWeakReference(this), ApplyRefreshMessage);
我按如下方式实现了 EquatableWeakReference
类:
/// <summary>
/// A weak reference which can be compared with another one, based on the target comparison.
/// </summary>
public class EquatableWeakReference : IEquatable<EquatableWeakReference>
{
private WeakReference reference;
private int targetHashcode;
public EquatableWeakReference(object target)
{
if (target == null)
throw new ArgumentNullException("target");
reference = new WeakReference(target);
targetHashcode = target.GetHashCode();
}
public override bool Equals(object obj)
{
return Equals(obj as EquatableWeakReference);
}
/// <summary>
/// As Equals is overriden, we must provide an override for GetHashCode.
/// </summary>
/// <returns></returns>
public override int GetHashCode()
{
return targetHashcode;
}
public bool Equals(EquatableWeakReference other)
{
if (other == null
|| !reference.IsAlive
|| !other.reference.IsAlive)
return false; // we assume that if both references are not alive, the result is inconclusive : let's say false.
return this.reference.Target.Equals(other.reference.Target);
}
}
优点是在 View 和 View 模型上都是轻量级代码,没有内存泄漏。测试成功。如果您有更好的解决方案,请随时发表评论。
最佳答案
Token 是 View 传递给 ViewModel 的对象唯一值,它们都使用相同的 Token。喜欢
View
public partial class MainWindow : Window
{
readonly string Token;
public MainWindow()
{
Token = Guid.NewGuid().ToString();
InitializeComponent();
DataContext = new MainViewModel(Token);
}
}
ViewModel
public class MainViewModel
{
readonly string Token;
public MainViewModel(string token)
{
Token = token;
}
}
实际上 Token 背后的逻辑是,当我们向 Messenger 注册一个委托(delegate)时。它确实有内部字典,并且此 Token 充当该字典中的键。 View 及其 ViewModel 必须具有相同的 token ,以便可以在 Send 方法上触发与该键对应的确切委托(delegate)。
关于c# - 从 View 发送消息到 ViewModel : what is an appropriate token?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20922165/
我正在开发一个应用程序,它使用 OAuth - 基于 token 的身份验证。 考虑到我们拥有访问和刷新 token ,这就是流程的样子。 Api call -> intercepter append
如何取消标记此代码的输出? 类(class)核心: def __init__(self, user_input): pos = pop(user_input) subject = ""
当我使用命令 kubectl 时与 --token标记并指定 token ,它仍然使用 kubeconfig 中的管理员凭据文件。 这是我做的: NAMESPACE="default" SERVICE
我正在制作 SPA,并决定使用 JWT 进行身份验证/授权,并且我已经阅读了一些关于 Tokens 与 Cookies 的博客。我了解 cookie 授权的工作原理,并了解基本 token 授权的工作
我正在尝试从应用服务获取 Google 的刷新 token ,但无法。 日志说 2016-11-04T00:04:25 PID[500] Verbose Received request: GET h
我正在开发一个项目,只是为了为 java 开发人员测试 eclipse IDE。我是java新手,所以我想知道为什么它不起作用,因为我已经知道该怎么做了。这是代码: public class ecli
我正在尝试使用 JwtSecurityTokenHandler 将 token 字符串转换为 jwt token 。但它出现错误说 IDX12709: CanReadToken() returned
我已阅读文档 Authentication (来自 Facebook 的官方)。我仍然不明白 Facebook 提供的这三种访问 token 之间的区别。网站上给出了一些例子,但我还是不太明白。 每个
我的部署服务器有时有这个问题,这让我抓狂,因为我无法在本地主机中重现,我已经尝试在我的 web.config 中添加机器 key ,但没有成功远。 它只发生在登录页面。 我的布局:
我已经设法获得了一个简单的示例代码,它可以创建一个不记名 token ,还可以通过阅读 stackoverflow 上的其他论坛来通过刷新 token 请求新的不记名 token 。 启动类是这样的
如果我有以前的刷新 token 和使用纯 php 的访问 token ,没有 Google Api 库,是否可以刷新 Google Api token ?我在数据库中存储了许多用户刷新和访问 toke
我通过 Java 应用程序使用 Google 电子表格时遇到了问题。我创建了应用程序,该应用程序运行了 1 年多,没有任何问题,我什至在 Create Spreadsheet using Google
当我有一个有效的刷新 token 时,我正在尝试使用 Keycloak admin REST API 重新创建访问 token 。 我已经通过调用 POST/auth/realms/{realm}/p
我正在尝试让第三方 Java 客户端与我编写的 WCF 服务进行通信。 收到消息时出现如下异常: Cannot find a token authenticator for the 'System.I
在尝试将数据插入到我的 SQl 数据库时,我收到以下错误 System.Data.SqlServerCe.SqlCeException: There was an error parsing the
使用数据库 session token 系统,我可以让用户使用用户名/密码登录,服务器可以生成 token (例如 uuid)并将其存储在数据库中并将该 token 返回给客户端。其上的每个请求都将包
我最近注册了 Microsoft Azure 并设置了认知服务帐户。使用 Text Translation API Documentation 中的说明我能够使用 interactive online
我使用 IAntiforgery API 创建了一个 ASP.Net Core 2 应用程序。 这提供了一种返回 cookie 的方法。 客户端获取该 cookie,并在后续 POST 请求中将该值放
我正在使用 spacy 来匹配某些文本(意大利语)中的特定表达式。我的文本可以多种形式出现,我正在尝试学习编写一般规则的最佳方式。我有如下 4 个案例,我想写一个适用于所有案例的通用模式。像这样的东西
我无法理解 oauth 2.0 token 的原则处理。 我的场景是,我有一个基于 web 的前端后端系统,带有 node.js 和 angular 2。用户应该能够在此站点上上传视频。然后创建一些额
我是一名优秀的程序员,十分优秀!