Я создал проект WPF под названием WpfDataBindTests. С MainWindow.xaml у меня есть эта настройка:
<Window x:Class="WpfDataBindTests.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:WpfDataBindTests"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid Name="myGrid">
<TextBox Text="{Binding Path=Name2}"/>
</Grid>
</Window>
В .xaml.xs я получил это
namespace WpfDataBindTests
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window, INotifyPropertyChanged
{
public MainWindow()
{
InitializeComponent();
myGrid.DataContext = this;
_name2 = "Start...";
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private string _name2;
public string Name2
{
get { return _name2; }
set
{
if (value != _name2)
{
_name2 = value;
OnPropertyChanged("Name2");
}
}
}
}
}
Затем я изменил тип приложения на консольное и удалил App.xaml, чтобы переопределить класс Program в качестве точки входа:
namespace WpfDataBindTests
{
class Program
{
[STAThread]
static void Main(string[] args)
{
MainWindow x = new MainWindow();
x.Show();
x.Name2 = "HELLO";
System.Threading.Thread.Sleep(1000);
x.Name2 = "THIS";
System.Threading.Thread.Sleep(1000);
x.Name2 = "WORKED";
Console.ReadKey();
}
}
}
Моя проблема в том, что вызов строк x.Name2 = "xyz"
не меняет текст, отображаемый в окне WPF.
До сих пор я пытался добавить в параметр привязки TextBox:
RelativeSource={RelativeSource AncestorType=Window}
а также
Mode=TwoWay
, ни один из которых не имеет значения.
Но если я добавлю MessageBox.Show ("") между строками x.Name2 = "", текст в форме изменится !!! - Итак, что здесь происходит, что вызывает обновление
class Program
{
[STAThread]
static void Main(string[] args)
{
MainWindow x = new MainWindow();
x.Show();
x.Name2 = "HELLO";
MessageBox.Show("");
System.Threading.Thread.Sleep(1000);
x.Name2 = "THIS";
MessageBox.Show("");
System.Threading.Thread.Sleep(1000);
x.Name2 = "WORKED";
MessageBox.Show("");
Console.ReadKey();
}
}