UWP
DataBinding
マークアップ拡張機能を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} の公式ドキュメントでは、この新機能について言及していますが、依存関係のないプロパティがバインディングのターゲットになる理由と方法については説明していません。