WPF で XAML 側に DataContext や ViewModel を代入した後、実際に Binding で解決された結果を使いたいケースがある (ほんとうに?)。 そういうときに使うテク。
例えば以下のような XAML があったとき:
<Page x:Class="Starist.Views.Pages.TagPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:Starist.Views.Pages" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Title="TagPage" d:DesignHeight="450" d:DesignWidth="800" mc:Ignorable="d"> <Grid> <TextBlock Text="{Binding ViewModel.Name, Mode=OneWay}" /> </Grid> </Page>
コードビハインド側から、 ViewModel.Name
が、どこの誰?というのを知りたい場合、以下のようにすると得られる。
var expression = this.GetBindingExpression(TextBlock.TextProperty); expression.ResolvedSource // => TagPageViewModel expression.ResolvedSourcePropertyName // => "Name"
あとは、例えば INotifyPropertyChanged
などのようなもので購読することで Binding を再現することもできる:
var expression = this.GetBindingExpression(TextBlock.TextProperty); if (expression.ResolvedSource is INotifyPropertyChanged c) { c.PropertyChanged += (_, e) => { if (e.PropertyName == expression.ResolvedSourcePropertyName) { Debug.WriteLine("Woo!"); } } }
という小ネタでした。