查看激活
为了使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);
}
}