如何从代码中绑定
在Avalonia中,从代码中绑定与WPF/UWP中的方式有些不同。在底层,Avalonia的绑定系统基于Reactive Extensions的 IObservable
,然后由XAML绑定进行构建(这些绑定也可以在代码中实例化)。
订阅属性的更改
您可以通过调用 GetObservable
方法来订阅属性的更改。这将返回一个 IObservable<T>
,可用于监听属性的更改:
var textBlock = new TextBlock();
var text = textBlock.GetObservable(TextBlock.TextProperty);
每个可订阅的属性都有一个静态只读字段,称为 [PropertyName]Property
,该字段在 GetObservable
中传递以订阅属性的更改。
IObservable
(是Reactive Extensions的一部分,简称为rx)超出了本指南的范围,但以下是一个示例,该示例使用返回的可观察对象将更改的属性值打印到控制台:
var textBlock = new TextBlock();
var text = textBlock.GetObservable(TextBlock.TextProperty);
text.Subscribe(value => Console.WriteLine(value + " Changed"));
当订阅返回的可观察对象时,它将立即返回属性的当前值,然后在每次属性更改时推送一个新值。如果您不想要当前值,可以使用 rx 的 Skip
运算符:
var text = textBlock.GetObservable(TextBlock.TextProperty).Skip(1);
绑定到可观察对象
您可以使用 AvaloniaObject.Bind
方法将属性绑定到可观察对象:
// 在这里我们使用Rx Subject,以便我们可以使用OnNext推送新值
var source = new Subject<string>();
var textBlock = new TextBlock();
// 将TextBlock.Text绑定到source
var subscription = textBlock.Bind(TextBlock.TextProperty, source);
// 将textBlock.Text设置为"hello"
source.OnNext("hello");
// 将textBlock.Text设置为"world!"
source.OnNext("world!");
// 终止绑定
subscription.Dispose();
请注意,Bind
方法返回一个 IDisposable
,可用于终止绑定。如果您从不调用此方法,那么当可观察对象通过 OnCompleted
或 OnError
结束时,绑定将自动终止。