在WPF/MAUI中使用x:Bind

发布时间 2023-11-26 16:00:34作者: zxbmmmmmmmmm

最近逛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之类的

缺陷

  • 没有代码提示
  • 不支持热重载