警卫条款不会被解雇

时间:2011-07-16 20:57:10

标签: c# windows-phone-7 mvvm caliburn.micro guard-clause

所以我一直试图让警卫条款与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 个答案:

答案 0 :(得分:2)

当您在文本框中键入内容然后选择另一个元素(以便文本框失去焦点)时,guard子句是否会触发?如果是这样,请尝试模拟绑定的UpdateSourceTrigger = PropertyChanged设置。请参阅"UpdateSourceTrigger=PropertyChanged" equivalent for a Windows Phone 7 TextBox以确定如何模拟此行为。

编辑:我看到,您按照惯例绑定到UserAccount的“DisplayName”属性。这意味着,当您在文本框中键入内容时,将不会调用EditAccountNameViewModel.UserAccount属性的setter。相反,将调用UserAccount.DisplayName上的setter。我建议你做的是在你的ViewModel中创建另一个属性,比如UserAccountDisplayName,看起来像这样,然后绑定到它:

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

这个+模拟的PropertyChanged触发器应该可以工作。