7

UWP使用标记扩展的新方法DataBinding,当我发现这个新功能时,我发现我们实际上可以将事件绑定到方法!Compiled Binding{x:Bind}

例子 :

xml:

<Grid>
    <Button Click="{x:Bind Run}" Content="{x:Bind ButtonText}"></Button>
</Grid>

代码背后:

private string _buttonText;

public string ButtonText
{
     get { return _buttonText; }
     set
         {
             _buttonText = value;
             OnPropertyChanged();
         }
}

public MainPage()
{
    this.InitializeComponent();
    ButtonText = "Click !";
}

public async void Run()
{
    await new MessageDialog("Yeah the binding worked !!").ShowAsync();
}

结果 :

在此处输入图像描述

由于 {x:Bind} 绑定是在运行时评估的,编译器会生成一些代表该绑定的文件,所以我去那里调查发生了什么,所以在 MainPage.g.cs 文件中(MainPage 是有问题的 xaml 文件) 我找到了这个 :

 // IComponentConnector

 public void Connect(int connectionId, global::System.Object target)
 {
      switch(connectionId)
      {
           case 2:
           this.obj2 = (global::Windows.UI.Xaml.Controls.Button)target;
                        ((global::Windows.UI.Xaml.Controls.Button)target).Click += (global::System.Object param0, global::Windows.UI.Xaml.RoutedEventArgs param1) =>
           {
               this.dataRoot.Run();
           };
                break;
           default:
                break;
      }
}

编译器似乎知道这是一个有效的绑定,而且它创建了相应的事件处理程序,并在里面调用了相关的方法。

这太棒了 !但为什么 ??绑定目标应该是依赖属性,而不是事件。{x:Bind} 的官方文档确实提到了这个新特性,但没有解释为什么以及如何非依赖属性成为绑定的目标,任何对此有深入解释的人?

4

2 回答 2

3

嗯,这是“x:Bind”编译绑定的新特性。

https://msdn.microsoft.com/en-us/library/windows/apps/mt204783.aspx

事件绑定是编译绑定的新特性。它使您能够使用绑定指定事件的处理程序,而不必是背后代码的方法。例如:单击="{x:Bind rootFrame.GoForward}"。

对于事件,目标方法不得重载,并且还必须:

  1. 匹配事件的签名。
  2. 或没有参数。
  3. 或具有相同数量的可从事件参数类型分配的类型参数。

我猜你的场景完全符合第 2 项。

于 2016-02-04T02:19:56.790 回答
1

绑定目标应该是依赖属性

虽然这对于常规绑定是正确的,但它不适用于{x:Bind}标记扩展。

所以你实际上可以有一个非依赖属性,比如

public sealed partial class MyUserControl : UserControl
{
    public Color BackgroundColor
    {
        get { return ((SolidColorBrush)Background).Color; }
        set { Background = new SolidColorBrush(value); }
    }
}

作为这样的{x:Bind}目标:

<local:MyUserControl BackgroundColor="{x:Bind ViewModel.BgColor}" />

尽管

<local:MyUserControl BackgroundColor="{Binding ViewModel.BgColor}" />

会失败。

于 2016-02-04T12:02:16.057 回答