2011-07-16 23 views
1

私はCaliburn.Microとバインドされたテキストボックスで動作するようにガード句を取得しようとしています。Guard Clause Not Firing

ビュー:

<TextBox x:Name="UserAccount_DisplayName" Margin="-10,-5,-10,8"/> 

<phone:PhoneApplicationPage.ApplicationBar> 
    <shell:ApplicationBar IsVisible="True" IsMenuEnabled="False"> 
    <shell:ApplicationBar.Buttons> 
     <cal:AppBarButton IconUri="\Resources\Iconography\appbar.check.rest.png" 
          Text="Save" 
          Message="SaveAndNavigateToAddAccountView" /> 
    </shell:ApplicationBar.Buttons> 
    </shell:ApplicationBar> 
</phone:PhoneApplicationPage.ApplicationBar> 

のViewModel:

public class EditAccountNameViewModel: PropertyChangedBase 

public Account UserAccount 
    { 
     get 
     { 
      return account; 
     } 
     set 
     { 
      account = value; 
      NotifyOfPropertyChange(() => UserAccount); 
      NotifyOfPropertyChange(() => CanSaveAndNavigateToAddAccountView); 
     } 
    } 

public bool CanSaveAndNavigateToAddAccountView 
    { 
     get 
     { 
      if (string.IsNullOrEmpty(UserAccount.DisplayName) == true) 
      { 
       return false; 
      } 

      return true; 
     } 
    } 

public void SaveAndNavigateToAddAccountView() 
    { 
     CommitAccountToStorage(); 
     navigationService.UriFor<AddAccountViewModel>().Navigate(); 
    } 

テキストボックスに入力を開始した後に何らかの理由でガード句が表示されないということは、私が想定していたはずのことです。何か案は?

答えて

2

テキストボックスに何かを入力してから別の要素を選択すると(テキストボックスのフォーカスが失われるように)、ガード節が起動しますか?その場合は、バインディングのUpdateSourceTrigger = PropertyChanged設定をシミュレートしてみてください。この動作をシミュレートする方法については、"UpdateSourceTrigger=PropertyChanged" equivalent for a Windows Phone 7 TextBoxへのanwsersを参照してください。

EDIT:UserAccountの "DisplayName"プロパティにバインドしていることがわかります。つまり、テキストボックスに何かを入力すると、EditAccountNameViewModel.UserAccountプロパティのセッターは呼び出されません。代わりに、UserAccount.DisplayNameのセッターが呼び出されます。私はあなたがすることをお勧めしたいことはUserAccountDisplayNameを言って、あなたのViewModelに別のプロパティを作成することです、それは次のようにかなっなり、代わりにそれにバインド:

public string UserAccountDisplayName 
{ 
    get { return UserAccount.DisplayName; } 
    set 
    { 
     UserAccount.DisplayName = value; 
     NotifyOfPropertyChange(() => UserAccountDisplayName); 
     NotifyOfPropertyChange(() => CanSaveAndNavigateToAddAccountView); 
    } 
} 

この+模擬して、PropertyChangedトリガが動作するはずです。

+0

いや、それは最初の時間を発射(ときにインスタンスのビュー)と、その後の後、それは私が、私は完璧に動作し、別の提案 – deanvmc

+0

を失っていない場合は、入力したときに何もないことトリガを変更したプロパティを追加する必要はありません。 – maciejkow

+0

を追加しましたし、私はdidnの焦点を合わせる:( – deanvmc