输入KeyPress上的CallMethodAction

时间:2016-03-21 23:28:13

标签: c# xaml winrt-xaml attachedbehaviors

我有一个附加行为,当按下 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

的XAML
<Button Command="{Binding Path=AddCategoryCommand}"
        Content="+" />

AddCategoryCommand定义:

public DelegateCommand AddCategoryCommand => new DelegateCommand(AddCategory);

如您所见,Button只是调用与AddCategory相同的TextBox方法。

修改

我认为还应该注意到我试图在方法中设置断点以确保一切正常。使用断点,该方法每次都能正确执行,因此在我看来是某种时序问题,这就是我尝试删除async内容的原因。

1 个答案:

答案 0 :(得分:2)

好问题。好。您可以使用模板10,也可以从中窃取KeyBehavior。我是模板10的作者,从中窃取代码非常好。

  

https://github.com/Windows-XAML/Template10/blob/master/Template10%20(Library)/Behaviors/KeyBehavior.cs

以下是如何使用它的示例:

  

https://github.com/Windows-XAML/Template10/blob/master/Templates%20(Project)/Minimal/Views/MainPage.xaml

<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>

祝你好运。