2010-11-13 23 views
0

我正在寫一個Silverlight 4應用程序使用「Silverlight 4 Unleashed」作爲基礎。Silverlight 4回調積累與每個按鈕按

我有一個ChildWindow登錄用戶名,密碼和記住我。 OK按鈕使用RelayCommand綁定到我的AuthUserViewModel SignIn。

由於我剛剛開始,我還沒有任何數據驗證,並發現一些奇怪的事情。

如果我在我的登錄子窗口上單擊「確定」,我的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

啊!你的客戶端對象是一個字段,並且你確保它在不同的調用中被共享。它阻止它在每個SignIn調用中初始化,但每次在執行SignInAsyncFunction之前向SignInCompleted通風孔添加處理程序。

因此,處理程序被後續SignIn執行一次是正常的。

爲了防止這種情況,有兩種方式:

1)建立在每個簽到調用一個新的客戶端(這將是垃圾後收集)

2)附上您的處理程序時初始化客戶端。 即在EnsureClient,你應該有這樣的:

if(client == null) 
{ 
    client = new MyClient(); 
    client.SignInCompleted +=(sender,result) =>{...}; 
} 

,並在簽到功能:

EnsureClient(); 
client.SignInAsync(authUser); 
+0

謝謝您的答覆和幫助。我在一夜之間睡了一覺,今天早上想出了一個解決方案,然後我看到了這個。再次感謝您的回覆。 – user506897 2010-11-14 14:21:12

+0

我的不好...這並沒有解決我的問題。我會實施你的建議。謝謝 - D – user506897 2010-11-14 18:20:33

+0

我去了選項1.謝謝! – user506897 2010-11-14 22:46:37