2014-04-01 62 views
1

爲了讓我熟悉MVVM for WinRT,我一直在看例子的MvvmLight WinRT項目。目前我遇到了一個問題,即我的RelayCommand只被調用一次(在構建viewmodel時)。如果用戶被授權,我想要做的是轉到MainViewModel。如果我在LoginCommand方法中刪除了登錄的條件檢查,則RelayCommand按預期工作。任何想法,我做錯了什麼?我不應該在LoginCommand中進行驗證嗎?NavigateCommand只調用一次

LoginViewModel(一些代碼已被移除):

public class LoginViewModel : ViewModelBase { 
    private readonly IDataService _dataService; 
    private readonly INavigationService _navigationService; 

    private RelayCommand _navigateCommand; 
    private Login login; //contains username and password 

    /// <summary> 
    /// Gets the NavigateCommand. 
    /// THIS DOES NOT GET FIRED UPON BUTTON CLICK 
    /// </summary> 
    public RelayCommand LoginCommand{ 
    get { 
     if (login != null && login.UserName.Equals("Test")) 
      return _navigateCommand ?? (_navigateCommand = new RelayCommand(() => _navigationService.Navigate(typeof(MainPage)))); 
     return _navigateCommand; 
    } 
    } 

LoginPage.xaml.cs(一些代碼已被移除):

public sealed partial class LoginPage { 
    public LoginViewModel Vm { 
    get { return (LoginViewModel)DataContext; } 
    } 

    public LoginPage() { 
    InitializeComponent(); 
    } 

    protected override void LoadState(object state) { 
    var casted = state as LoginPageState; 

    if (casted != null) { 
     Vm.Load(casted); 
    } 
    } 

    protected override object SaveState() { 
    return new LoginPageState { 
     Credentials = new Login { 
      UserName = txtUserName.Text, 
      Password = txtPassword.Text 
     } 
    }; 
    } 

    public class LoginPageState { 
     public Login Credentials { get; set; } 
     } 
    } 
} 

LoginPage.xaml(一些代碼已被刪除)

<Button Content="Login" 
      x:Name="NextPageButton" 
      HorizontalAlignment="Right" 
      VerticalAlignment="Top" 
      Margin="10" 
      Command="{Binding LoginCommand}" /> 

回答

1

問題是條件。當您的LoginPage加載時,它會嘗試將您的Button綁定到LoginCommand。爲了達到這個目的,它從ViewModel獲得LoginCommand。在那個時間點Login爲空,因此財產將返回_navigateCommand這是null。之後,該頁面將不會嘗試使用LoginCommand,因爲它已經知道它的價值。

爲了解決這個問題,你可以移動的條件lambda表達式內:

public RelayCommand LoginCommand 
{ 
    get 
    { 
     return _navigateCommand ?? (_navigateCommand = new RelayCommand(
      () => 
      { 
       if (login != null && login.UserName.Equals("Test")) 
       { 
        _navigationService.Navigate(typeof(MainPage)); 
       } 
      })); 
    } 
} 

一個更好的解決辦法是授權移動到另一個階級。例如:

public RelayCommand LoginCommand 
{ 
    get 
    { 
     return _navigateCommand ?? (_navigateCommand = new RelayCommand(
      () => 
      { 
       if (_authorizationService.UserAuthorized(login)) 
       { 
        _navigationService.Navigate(typeof(MainPage)); 
       } 
      })); 
    } 
} 

希望這有助於。

+0

它仍然沒有工作,我認爲另一個問題可能是模型和視圖的約束。更新視圖背後的模型是否有最佳做法? – theStig