跳到主要内容
版本:11.0.0

如何不使用ReactiveUI绑定命令

有时候你只是想在点击按钮时调用一个方法,而不想使用 ReactiveUI 框架创建响应式命令的整套流程。

信息

要了解如何使用 ReactiveUI 绑定到命令,请参阅这里

Avalonia UI 数据绑定允许你直接实现既可以执行操作的视图模型方法,又可以控制方法是否可以执行的属性。

例如,使用以下XAML:

<Window xmlns="https://github.com/avaloniaui">
...
<StackPanel Margin="20">
<Button Command="{Binding PerformAction}"
CommandParameter="From the button, without ReactiveUI">
Run the example</Button>
</StackPanel>
</Window>

你可以编写一个能够运行操作的视图模型,像这样:

namespace AvaloniaGuides.ViewModels
{
public class MainWindowViewModel
{
public void PerformAction(object msg)
{
Debug.WriteLine($"The action was called. {msg}");
}
}
}

能否执行?

Avalonia UI 数据绑定提供了一种使用命名约定来实现“能否执行?”的功能的简单方法。

如果你需要根据命令参数的值或视图模型属性的值来决定是否执行,那么你可以编写一个第二个布尔方法来检查操作方法是否可以执行。

为了使其工作,Avalonia UI 使用了布尔方法与操作方法相同的根名称,但加上了前缀 Can 的命名约定。

例如:

namespace AvaloniaGuides.ViewModels
{
public class MainWindowViewModel
{
public void PerformAction(object msg)
{
Debug.WriteLine($"The action was called. {msg}");
}

public bool CanPerformAction(object msg)
{
if (msg!=null) return !string.IsNullOrWhiteSpace( msg.ToString() );
return false;
}
}
}

因此,扩展示例XAML以从文本框提供参数(字符串):

<StackPanel Margin="20">
<TextBox Margin="0 5" x:Name="message"
Watermark="Add a message to enable the button"/>
<Button Command="{Binding PerformAction}"
CommandParameter="{Binding #message.Text}">
Run the example
</Button>
</StackPanel>
信息

这个示例使用了直接绑定到另一个控件的技术。你可以在这里看到如何做到这一点,这里

你会发现只有当文本框包含字符串时,按钮才会变为可用状态。

触发“能否执行”

如果你想要从视图模型中的另一个属性触发“能否执行”方法,那么你将不得不为该属性添加一个或多个 DependsOn 属性,并编写代码来手动调用属性更改事件。

信息

这种技术适用于没有使用 ReactiveUI 框架的视图模型。