为什么这个委托变量为null?

时间:2014-01-21 19:32:23

标签: c# wpf xaml mvvm

我想将MainViewModel中的方法传递给LoginViewModel对象中的委托变量,如下所示:

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为null ...

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 个答案:

答案 0 :(得分: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在命令被调用时准备就绪。