单击其他地方后如何触发命令?

How to fire a command after clicking somewhere else?

所以,我有一个自定义控件,CusConA,它基本上像一个文本框一样工作 - 你输入你需要的金额,我在下面有一个按钮,由谁被点击会在某处保存该金额(来自 CusConA),并且工作正常。

但我想基本上通过单击该页面上的任意位置来尝试相同的功能(类似于 asp.net 中的 OnBlur),或者更准确地说,当我的 CusConA 不再处于焦点时。

通过执行代码中 --> 所示的操作,我实现了某种解决方案,这种方式在任何地方按下时,即使我从未尝试写入数量,命令也会被执行。

因此,为了尝试圈出我的问题,我需要此命令仅在键入一定数量并在之后单击某处后执行。我该怎么做?

<Frame
            Margin="55,0"
            Padding="0"
            BorderColor="Blue"
            CornerRadius="30">
            <StackLayout Orientation="Horizontal">
                <Label
                    Margin="10"
                    FontAttributes="Bold"
                    FontSize="20"
                    HorizontalTextAlignment="Center"
                    Text="RSD"
                    TextColor="Some text"
                    VerticalTextAlignment="Center" />
                <customControls:CusConA
                    Margin="0,0,15,0"
                    HorizontalOptions="FillAndExpand"
                    Keyboard="Numeric"
                    Placeholder="0,00"
                    PlaceholderColor="Gray"
                    Text="Some text"
                    TextColor="Black" >
-->                  <customControls:CusConA.Behaviors>
                        <xct:EventToCommandBehavior  EventName="Unfocused" Command="{Binding DoSomething}" ></xct:EventToCommandBehavior>
                    </customControls:CusConA.Behaviors>
                </customControls:CusConA>
            </StackLayout>
        </Frame>

能否更改 DoSomething 以检查是否已键入金额?可能涉及向您的控件添加一个布尔值 属性:

bool CanExecute { get; set; }

然后将“金额”绑定到 属性,其 setter 设置 CanExecute = true;CanExecute = false;,具体取决于是否已键入金额。类似于:

string Amount
{
    ...
    set {
        _amount = value;
        myControl.CanExecute = value.Count > 0;
    }
}

然后把DoSomething正文改成

if (this.CanExecute) { ... }

或者,可以使用其他技术对 Amount 的更改触发对 myControl 上的 属性 的更改。

要点是:

  1. 添加CanExecute属性,以便控制可以在执行该命令有效时被告知。
  2. 使用某种技术从其他地方绑定或触发 myControl.CanExecute 更改。

我觉得你可以用EventToCommandBehavior来实现这个功能。

Xamarin.Forms 个示例中有一个 EventToCommandBehavior 的示例(参见 here)。

<ContentPage.BindingContext>
    <focusapp:MyViewModel></focusapp:MyViewModel>
</ContentPage.BindingContext>

<StackLayout>
    <Entry>
        <Entry.Behaviors>
            <Behaviors:EventToCommandBehavior 
        EventName="Unfocused" 
        Command="{Binding EntryUnfocused}" />
        </Entry.Behaviors>
    </Entry>

</StackLayout>

并在 viewmodel.cs 中定义 EntryUnfocused(例如 MyViewModel),如下所示:

MyViewModel.cs

public class MyViewModel
{
    public ICommand EntryUnfocused { get; protected set; }

    public MyViewModel() {

        EntryUnfocused = new Command(CompletedCommandExecutedAsync);
    }

    private void CompletedCommandExecutedAsync(object param)
    {
        System.Diagnostics.Debug.WriteLine("------------> come here....");
    }
}