7

UWPDataBindingマークアップ拡張機能をCompiled Binding使用する新しい方法が付属していましたが{x:Bind}、この新機能を発見したとき、実際にイベントをメソッドにバインドできることがわかりました!

例 :

XAML :

<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} バインディングは実行時に評価され、コンパイラはそのバインディングを表すいくつかのファイルを生成するため、何が起こっているのかを調査するためにそこに行きました。 ) 私はこれを見つけました :

 // 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

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 に答える