单击其他地方后如何触发命令?
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
上的 属性 的更改。
要点是:
- 添加
CanExecute
属性,以便控制可以在执行该命令有效时被告知。
- 使用某种技术从其他地方绑定或触发
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....");
}
}
所以,我有一个自定义控件,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
上的 属性 的更改。
要点是:
- 添加
CanExecute
属性,以便控制可以在执行该命令有效时被告知。 - 使用某种技术从其他地方绑定或触发
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....");
}
}