1

そのため、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();
    }

何らかの理由で、テキストボックスに入力し始めた後、guard句が起動しません。これは、発生するはずだと思っていたものです。何か案は?

4

1 に答える 1

2

テキストボックスに何かを入力してから別の要素を選択すると(テキストボックスがフォーカスを失うように)、guard句が起動しますか?その場合は、バインディングのUpdateSourceTrigger=PropertyChanged設定をシミュレートしてみてください。この動作をシミュレートする方法については、Windows Phone7TextBoxに相当する「UpdateSourceTrigger=PropertyChanged」への回答を参照してください。

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

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

+この+シミュレーションPropertyChangedトリガーは機能するはずです。

于 2011-07-16T21:33:42.810 に答える