2011-07-16 4 views
1

그래서 Caliburn.Micro 및 바인딩 된 텍스트 상자로 작업 할 때 guard 절을 사용하려고했습니다.Guard 절을 실행하지 않음

보기 :

<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> 

뷰 모델 :

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를 참조하십시오.

편집 : UserAccount의 "DisplayName"속성에 (규칙에 따라) 바인딩되어 있습니다. 즉, 텍스트 상자에 내용을 입력 할 때 EditAccountNameViewModel.UserAccount 속성의 setter가 호출되지 않습니다. 대신 UserAccount.DisplayName에 대한 setter가 호출됩니다. 내가 당신이 할 게 좋을 것 것은 UserAccountDisplayName 말, 당신의 ViewModel의 다른 속성을 만드는 것입니다, 그 같은 STH 보일 것이고, 대신에 바인딩 :

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

이 + 시뮬레이션하여 PropertyChanged 트리거가 작동합니다.

+0

아니요, 처음 시작할 때 (뷰가 인스턴스화 될 때), 그 다음에는 아무 것도 입력하지 않을 때, 포커스를 잃을 때가 아닙니다. ( – deanvmc

+0

다른 제안을 추가했습니다 – maciejkow

+0

완벽하게 작동합니다. 트리거를 변경 한 속성을 추가 할 필요가 없습니다. – deanvmc