我正在编写一个使用“Silverlight 4 Unleashed”作为基础的Silverlight 4应用程序。
我有一个ChildWindow登录用户名,密码和记住我。 OK按钮使用RelayCommand绑定到我的AuthUserViewModel SignIn。
由于我刚刚开始,我还没有任何数据验证,并注意到一些奇怪的事情。
如果我在Login子窗口中单击“确定”,我的Action回调告诉我MessageBox中的凭据无效...这是完美的。我出于各种原因使用自己的身份验证服务。
但是,如果我再次单击“确定”,我的服务会被调用一次,但是Action回调会被触发两次,告诉我我的凭据无效。如果我再次按“OK”,服务将被调用一次,但Action回调会被触发三次,依此类推。
为什么会这样做?
以下是有问题的代码:
public void SignIn(AuthUserDataModel authUser, Action<ErrorContainer> callback)
{
EnsureClient();
client.SignInCompleted += (sender, result) =>
callback(new ErrorContainer
{
AsyncException = result.Error,
CustomError = result.Result.CustomMessage //holds "Invalid credentials"
});
client.SignInAsync(authUser);
}
就像我说的那样,按钮事件被触发一次,Web服务被调用一次,但回调被触发的数量等于我按OK的次数。
谢谢。
答案 0 :(得分:1)
啊!您的客户端对象是一个字段,并确保它在调用之间共享。它阻止在每次SignIn调用时初始化它,但每次在执行SignInAsyncFunction之前向SignInCompleted透明表添加处理程序。
因此,处理程序由后续的SignIn执行一次是正常的。
为了防止这种情况,您有两种方法:
1)在每次SignIn调用中创建一个新客户端(稍后将进行垃圾回收)
2)初始化客户端时附加处理程序。 即在您的EnsureClient中,您应该具有以下内容:
if(client == null)
{
client = new MyClient();
client.SignInCompleted +=(sender,result) =>{...};
}
并在SignIn函数中:
EnsureClient();
client.SignInAsync(authUser);