每按一次按钮,Silverlight 4回调就会累积

时间:2010-11-13 18:58:40

标签: silverlight action

我正在编写一个使用“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的次数。

谢谢。

1 个答案:

答案 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);