2014-01-21 75 views
2

我想在MainViewModel的方法傳遞給委託變量在LoginViewModel對象是這樣的:爲什麼這個委託變量爲null?

public class ApplicationViewModel : INotifyPropertyChanged 
{ 
    private LoginViewModel loginViewModel; 

    public ApplicationViewModel() 
    { 
     loginViewModel = new LoginViewModel(); 
     this.loginViewModel.Login += this.checkLoginData; //stays null.. 
     CurrentPageViewModel = this.loginViewModel; //works fine 
    } 

    private void checkLoginData(string username, string password) 
    { 
     //validating data 
    } 
} 

但由於某些原因,loginViewModel.Login是空...

而這個命令在LoginViewModel在開始時持續觸發這個事件,並告訴我Login == null,這不是我期望的,因爲我在MainViewModel構造函數初始化委託。

我不是MVVM/WPF的專家,但我試圖爲它工作。

編輯:額外的信息。

而且loginViewModel.Login是這樣的委託變量:

class LoginViewModel : ObservableObject, IPageViewModel 
{ 
    public delegate void DelegateLogin(string username, string password); 
    private DelegateLogin _login; 

    public DelegateLogin Login 
    { 
     get { return this._login; } 
     set 
     { 
      /* 
      if(this._login != value) 
      { 
       this._login = value; 
       OnPropertyChanged("Login"); 
      }*/ 

      this._login = value; 
      OnPropertyChanged("Login"); 
     } 
    } 

    public ICommand CheckLoginCommand 
    { 
     get 
     { 
      if (Login != null) 
      { 
       this.checkLoginCommand = new Command(p => { Login(this._username, this._password); }); 
      } 

      else 
      { 
       System.Windows.MessageBox.Show("Login DELEGATE IS EMPTY!?!?!"); //keeps firing... 
      } 
      return this.checkLoginCommand; 
     } 
    } 
} 
+1

'登錄'是委託或事件?發佈如何聲明也。 –

+2

另外,是「checkLoginData」方法,還是另一個委託/事件變量? – elgonzo

+0

在爲其分配處理程序後,'Login'不能爲空。 1)序列不是你所聲稱的,或者2)你已經設法創建了2個獨立的viewmodel類實例。但是,你還沒有發佈足夠的細節讓我們對這些觀點有深入的瞭解。 – McGarnagle

回答

2

試試這個:

public ICommand CheckLoginCommand 
{ 
    get 
    { 
     if (this.checkLoginCommand == null) 
      this.checkLoginCommand = new Command(p => { 
       if (Login != null) 
        Login(this._username, this._password); 
       else 
        System.Windows.MessageBox.Show("Login DELEGATE IS EMPTY!?!?!"); //keeps firing... 
      }); 
     return this.checkLoginCommand; 
    } 
} 

這樣做無論對Login代表組的創建命令的優勢。除此之外,希望Login將在該命令被調用時準備就緒。

+0

謝謝!這可行......但我在WPF/Windows 8和其他XAML平臺上看到過更多「希望-blablabla-在-blablabla-之前運行......」爲什麼?沒有真正的執行命令嗎? –

+2

@ Kil'jaeden哈哈......好吧,*有*定義的順序,但它*可能*微妙,而微妙/複雜性充斥着初學者的疑難雜症。要完全熟悉它,需要對C#和XAML數據綁定框架有所瞭解。 – McGarnagle