Для привязки данных полезно подумать о нескольких вещах:
- Исходный объект
- Целевой объект (который должен быть DependencyObject)
- Исходное свойство (свойство исходного объекта, участвующее в привязке)
- Целевое свойство (которое должно быть свойством зависимости)
В вашем примере кода:
- Исходный объект = Window1
- Целевой объект = TextBox
- Свойство источника = свойство SomeText
- Целевое свойство = Текст
Расширение разметки Binding входит в свойство Target объекта Target.
Вот картинка, которая иллюстрирует вышесказанное:
Проверьте следующий код (один из способов решения этой проблемы):
<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 - это только один способ.
Следует отметить, что свойство Source не обязательно должно быть свойством Dependency, но в противном случае свойство Target не будет обновляться ... без какой-либо специальной помощи.
Проверьте следующий фрагмент кода (мои извинения это 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!";
}
}