最近逛GitHub的时候的时候,偶然看到了CompiledBindings这个库,据说可以实现和UWP中x:Bind一样的效果
原理也是在编译时生成相关代码,性能应该比自带的Binding好些
使用
从NuGet中安装:
安装完成后,可直接在XAML中使用x:Bind
使用方法类似于UWP,无需设置DataContext(默认绑定方式为OneWay)
绑定到属性
<TextBlock Text="{x:Bind ViewModel.Text}"/>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
public MainWindowViewModel ViewModel = new();
}
public partial class MainWindowViewModel:ObservableObject
{
[ObservableProperty]
public string _text;
public MainWindowViewModel()
{
var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
timer.Tick += (s, e) =>
{
Text = DateTime.Now.ToString();
};
timer.Start();
}
}
绑定到方法
<TextBox x:Name="MyTextBox"/>
<TextBlock Text="{x:Bind TestMethod(MyTextBox.Text)}" />
public string TestMethod(string text)
{
if (text == "Hello")
return "Hello";
else
return "你好";
}
运算符
<Button IsEnabled="{x:Bind not IsChanged}"/>
<TextBlock Visibility="{x:Bind IsChanged ? Collapsed : Visible}"/>
调试
可以在XAML中设置x:Bind的断点,当属性更新时即可触发
此外,这里还提供了UWP的x:Bind中没有的功能,比如StringFormat之类的
缺陷
- 没有代码提示
- 不支持热重载