TextBox Binding из отдельного класса
Есть WPF проект с одним MainWindow. Два текстбокса и кнопка. В один текстбокс вводим число, жмём кнопку, происходит действие и результат выводится в соседний текстбокс.
Биндинг работает замечательно пока все эти переменные и т.д. лежат в самом MainWindow. Как только же я выношу их в отдельный класс - биндинг с ними не работает, ничего не определяется. Попытался банальные вещи прописать в path (типа rest.Hop например), но само собой это не сработало.
Есть ли способ решить данную проблему?
С#
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = this;
}
Res rest = new Res();
private void Button_Click(object sender, RoutedEventArgs e)
{
rest.Pop = rest.Hop * 2;
}
}
public class Res : INotifyPropertyChanged
{
private int _hop;
public int Hop
{
get { return _hop; }
set
{
if (_hop != value)
{
_hop = value;
OnPropertyChanged();
}
}
}
private int _pop;
public int Pop
{
get { return _pop; }
set
{
if (_pop != value)
{
_pop = value;
OnPropertyChanged();
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged([CallerMemberName]string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
Xaml
<Window x:Class="testik1.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:testik1"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<TextBox Text="{Binding Path=Hop, Mode=TwoWay}" HorizontalAlignment="Left" Height="23" Margin="177,118,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
<TextBox Text="{Binding Path=Pop, Mode=TwoWay}" HorizontalAlignment="Left" Height="23" Margin="382,118,0,0" TextWrapping="Wrap" IsReadOnly="True"/>
<Button Click="Button_Click" Content="Button" HorizontalAlignment="Left" Margin="340,191,0,0" VerticalAlignment="Top" Width="75"/>
</Grid>
Ответы (1 шт):
Сейчас DataContext'ом ваше окна является само окно. Привязка "ищет" свойства Pop и Hop в MainWindow. Но теперь эти свойства находятся в другом классе.
Соответственно нужно DataContext'ом вашего окна сделать объект класса Res. Т.е.
public partial class MainWindow : Window
{
private Res rest;
public MainWindow()
{
InitializeComponent();
rest = new Res();
DataContext = rest;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
rest?.Pop = rest.Hop * 2;
}
}
Я всего лишь поправил код, чтобы он работал. Но вообще вам стоит посмотреть в сторону паттерна MVVM. Можно начать отсюда: https://habr.com/ru/post/338518/