Привязка данных является наиболее распространенным способом в WPF для отображения и сбора данных в пользовательском интерфейсе
Попробуйте это:
<Window x:Class="WpfApp3.MainWindow"
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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp3"
mc:Ignorable="d"
Title="MainWindow"
Height="350"
Width="525">
<Grid>
<TextBox Text="{Binding Path=SomeText, UpdateSourceTrigger=PropertyChanged}"
HorizontalAlignment="Left"
Margin="101,83,0,0"
VerticalAlignment="Top"
Width="75" />
<TextBlock Text="{Binding SomeText}"
HorizontalAlignment="Left"
Margin="101,140,0,0"
VerticalAlignment="Top"
Width="75" />
</Grid>
</Window>
Код для окна:
public partial class MainWindow : Window
{
private readonly AViewModel viewModel = new AViewModel();
public MainWindow()
{
InitializeComponent();
this.DataContext = viewModel;
}
}
И код для ViewModel, который содержит данные, которые вы хотите показать и собрать:
public class AViewModel : INotifyPropertyChanged
{
private string someText;
public string SomeText
{
get
{
return someText;
}
set
{
if (Equals(this.someText, value))
{
return;
}
this.someText = value;
this.OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(
[CallerMemberName]string propertyName = null)
{
this.PropertyChanged?.Invoke(
this,
new PropertyChangedEventArgs(propertyName));
}
}
Хотя это выглядит сложным для простого сценария, у него есть много преимуществ:
- Вы можете написать автоматический (модульный) тест для ViewModel без создания пользовательского интерфейса
- Добавление дополнительных полей и логики тривиально
- Если пользовательский интерфейс нужно изменить, ViewModel не всегда нужно будет менять
Ядром механизма является бит {Binding ...}
в Xaml, который сообщает WPF синхронизировать данные между свойством Text объекта TextBox и свойством SomeText объекта, который назначен DataContext.
Другие важные биты:
- в конструкторе окна настройка DataContext и
- в ViewModel вызывается событие PropertyChanged, когда свойство SomeText изменяется, так что привязка будет уведомлена.
Обратите внимание, что это только базовый пример привязки данных, в этот код можно внести множество улучшений.