所以我一直试图让警卫条款与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();
}
出于某种原因,在我开始输入文本框后,保护条款没有触发,这是我假设应该发生的事情。有什么想法吗?
答案 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触发器应该可以工作。