データ バインディングでは、いくつかのことを考えると役に立ちます。
- ソース オブジェクト
- ターゲット オブジェクト (DependencyObject である必要があります)
- ソース プロパティ (バインディングに参加しているソース オブジェクトのプロパティ)
- ターゲット プロパティ (依存プロパティである必要があります)
あなたのサンプルコードで:
- ソース オブジェクト = Window1
- ターゲット オブジェクト = TextBox
- ソース プロパティ = SomeText プロパティ
- ターゲット プロパティ = テキスト
Binding マークアップ拡張機能は、Target オブジェクトの Target プロパティに適用されます。
上記を説明する図は次のとおりです。

次のコードを確認してください (この問題を解決する 1 つの方法)。
<Window
x:Class="WpfApplication2.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="theWindow"
Title="Window1"
Height="300"
Width="300"
>
<Grid>
<StackPanel>
<TextBox Text="{Binding ElementName=theWindow, Path=SomeText}"/>
<Button
Width="100"
Height="25"
Content="Change Text"
Click="Button_Click"
/>
</StackPanel>
</Grid>
</Window>
Binding マークアップ拡張機能では、ElementName を使用してソースを定義しました。これにより、ビジュアル ツリー内の別の要素をソースとして使用できます。その際、x:Name 属性を使用してウィンドウに名前を付ける必要もありました。
Binding を使用してソースを定義する方法はいくつかあります (つまり、Source、ElementName、DataContext)。ElementName は 1 つの方法にすぎません。
注意すべきことの 1 つは、Source プロパティが依存関係プロパティである必要はないということですが、そうでない場合、Target プロパティは更新されません ... 特別な助けがなければ。次のコードを確認してください (C# で申し訳ありませんが、C# の方が速かったです)。その中で、INotifyPropertyChanged を実装していることがわかります。これにより、ソース オブジェクトは何かが変更されたことを示すことができます ... データ バインディングはそれを監視するのに十分スマートです。したがって、ボタンをクリックすると (ここのコード例から)、TextBox が更新されます。このインターフェイスを実装しないと (そしてボタンをクリックしても)、TextBox は更新されません。
それが役立つことを願っています。
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window, INotifyPropertyChanged
{
public Window1()
{
InitializeComponent();
}
private string _someText = "Hello World!";
public string SomeText
{
get { return _someText; }
set
{
_someText = value;
OnNotifyPropertyChanged("SomeText");
}
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
private void OnNotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
#endregion
private void Button_Click(object sender, RoutedEventArgs e)
{
this.SomeText = "Goodbye World!";
}
}