Пункт охраны не стреляет - PullRequest
1 голос
/ 17 июля 2011

Поэтому я пытался заставить охранные предложения работать с Caliburn.Micro и связанным текстовым полем.

Вид:

<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();
    }

По какой-то причине пункт охраны не срабатывает после того, как я начну печатать в текстовом поле, что, как я предполагал, должно произойти. Есть идеи?

1 Ответ

2 голосов
/ 17 июля 2011

Срабатывает ли пункт guard, когда вы вводите что-то в текстовое поле, а затем выбираете другой элемент (чтобы текстовое поле теряло фокус)?Если это так, попробуйте смоделировать параметр UpdateSourceTrigger = PropertyChanged привязки.См. Anwsers для «UpdateSourceTrigger = PropertyChanged» эквивалента для текстового поля Windows Phone 7 , чтобы увидеть, как имитировать это поведение.

РЕДАКТИРОВАТЬ: я вижу, что вы привязываете (по соглашению)"DisplayName" свойство UserAccount.Это означает, что установщик свойства EditAccountNameViewModel.UserAccount не будет вызываться при вводе чего-либо в текстовое поле.Вместо этого будет вызываться установщик для UserAccount.DisplayName.Я бы предложил вам создать еще одно свойство в вашей ViewModel, скажем, UserAccountDisplayName, которое бы выглядело вот так, и вместо этого привязать к нему:

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

Этот + имитирующий триггер PropertyChanged должен работать.

...