我有一个附加行为,当按下 ENTER 键时,使用CallMethodAction
行为来调用方法。 TextBox
XAML看起来像这样:
<TextBox x:Name="AddCategoryTextBox"
Width="180"
Text="{Binding Path=NewCategoryName,
Mode=TwoWay}"
Visibility="{Binding Path=AddCategoryVisible,
Converter={StaticResource BooleanToVisibilityConverter},
Mode=TwoWay}">
<interactivity:Interaction.Behaviors>
<behaviors:KeyBehavior Key="Enter">
<core:CallMethodAction MethodName="AddCategory" TargetObject="{Binding}" />
</behaviors:KeyBehavior>
</interactivity:Interaction.Behaviors>
</TextBox>
我知道正在调用该方法,因为它还将AddCategoryVisible
更改为false
,这有效地隐藏了TextBox
。这是AddCategory
方法:
public void AddCategory()
{
if (AddCategoryVisible)
{
// insert new category and set current invoice id
if (!string.IsNullOrEmpty(NewCategoryName))
{
var categoryId = InvoiceCategories.Count;
var category = new InvoiceCategory
{
CategoryName = NewCategoryName,
CategoryDescription = "",
CategoryId = categoryId
};
_invoiceCategoryRepository.InsertAsync(category);
InvoiceCategories.Add(category);
CurrentInvoice.CategoryId = categoryId;
NewCategoryName = string.Empty;
}
}
AddCategoryVisible = !AddCategoryVisible;
}
问题是当我按下 ENTER 键时,TextBox
将消失,但并不总是添加新类别。如果我再次添加新类别,则输入的文本就在那里,如果我再次点击 ENTER ,则表示成功。
我有Button
在点击时调用完全相同的方法,并且它在100%的时间都有效。我不确定会有什么区别,有什么我没看到的吗?
该方法最初是async
,而InsertAsync()
调用是await
,但我暂时将其删除,看看是否会产生任何影响。不幸的是,CallMethodAction
的行为仍然无法正常工作,但按钮点击可以正常工作。以下是Button
:
<Button Command="{Binding Path=AddCategoryCommand}"
Content="+" />
AddCategoryCommand
定义:
public DelegateCommand AddCategoryCommand => new DelegateCommand(AddCategory);
如您所见,Button
只是调用与AddCategory
相同的TextBox
方法。
修改
我认为还应该注意到我试图在方法中设置断点以确保一切正常。使用断点,该方法每次都能正确执行,因此在我看来是某种时序问题,这就是我尝试删除async
内容的原因。
答案 0 :(得分:2)
好问题。好。您可以使用模板10,也可以从中窃取KeyBehavior。我是模板10的作者,从中窃取代码非常好。
以下是如何使用它的示例:
<TextBox MinWidth="150" MinHeight="62"
Header="Parameter to pass"
Text="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
TextWrapping="Wrap">
<Interactivity:Interaction.Behaviors>
<!-- enable submit on enter key -->
<Behaviors:KeyBehavior Key="Enter">
<Core:CallMethodAction MethodName="GotoDetailsPage" TargetObject="{Binding}" />
</Behaviors:KeyBehavior>
<!-- focus on textbox when page loads -->
<Core:EventTriggerBehavior>
<Behaviors:FocusAction />
</Core:EventTriggerBehavior>
</Interactivity:Interaction.Behaviors>
</TextBox>
祝你好运。