跳到主要内容
版本:11.0.0

查看激活

为了使WhenActivated ReactiveUI功能正常工作,您需要使用Avalonia.ReactiveUI包中的自定义基类,例如ReactiveWindow<TViewModel>ReactiveUserControl<TViewModel>。当然,您也可以手动在类中实现IViewFor<TViewModel>接口,但请确保将ViewModel存储在AvaloniaProperty中。

激活示例

ViewModel.cs

此视图模型实现了IActivatableViewModel接口。当相应的视图附加到可视树时,WhenActivated块内的代码将被调用。当相应的视图从可视树中分离时,复合可处置对象将被处置。ReactiveObject视图模型类的基类,并实现了INotifyPropertyChanged

public class ViewModel : ReactiveObject, IActivatableViewModel
{
public ViewModelActivator Activator { get; }

public ViewModel()
{
Activator = new ViewModelActivator();
this.WhenActivated((CompositeDisposable disposables) =>
{
/* 处理激活 */
Disposable
.Create(() => { /* 处理停用 */ })
.DisposeWith(disposables);
});
}
}

View.xaml

这是上面所示视图模型的用户界面。

<Window xmlns="https://github.com/avaloniaui"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
Background="#f0f0f0" FontFamily="Ubuntu"
MinHeight="590" MinWidth="750">
<TextBlock Text="Hello, world!" />
</Window>

View.xaml.cs

这是上面你看到的View.xaml文件的代码后台。请记住,始终在View构造函数中调用WhenActivated,否则ReactiveUI将无法确定何时激活视图模型。

public class View : ReactiveWindow<ViewModel>
{
public View()
{
// ViewModel的WhenActivated块也将被调用。
this.WhenActivated(disposables => { /* 处理视图激活等 */ });
AvaloniaXamlLoader.Load(this);
}
}

Code-Behind ReactiveUI绑定

Avalonia XAML引擎不会生成强类型的x:Name引用来引用控件。目前,使用代码后台的ReactiveUI绑定的唯一方法是使用FindControl方法,该方法将根据XAML中指定的名称查找控件,或者使用{Binding Path}语法。

不应在表达式中使用FindControl方法。相反,可以创建一个调用FindControl方法的自定义属性,或者将控件存储在变量中。下面的示例演示了如何在Avalonia中使用ReactiveUI代码后台绑定。

public class View : ReactiveWindow<ViewModel>
{
// 假设Button控件在XAML中定义了Name="ExampleButton"属性。
public Button ExampleButton => this.FindControl<Button>("ExampleButton");

public View()
{
this.WhenActivated(disposables =>
{
// 将'ExampleCommand'绑定到上面定义的'ExampleButton'。
this.BindCommand(ViewModel, x => x.ExampleCommand, x => x.ExampleButton)
.DisposeWith(disposables);
});
AvaloniaXamlLoader.Load(this);
}
}