◆ TextBox.Text を書き換えても Binding のソースが変わらない
◆ PropertyChanged にするとムダに細かく更新するから 書き換えたときに手動更新
  ◆ BindingExpression の UpdateSource メソッド 

準備

こんな xaml で
<StackPanel>
    <Label Content="{Binding Text,ElementName=textbox}"/>
    <TextBox x:Name="textbox" Text="{Binding text}"/>
    <Button Click="Button_Click">テキストボックスに今の時間を入れる</Button>
    <Button Click="Button_Click_1">Binding したデータを表示</Button>
</StackPanel>

こんなコードを用意します
private class BindingData
{
    public string text { get; set; } = "初期値";
}

public MainWindow()
{
    this.DataContext = new BindingData();
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    this.textbox.Text = DateTime.Now.ToString("HH:mm:ss:fff");
}

private void Button_Click_1(object sender, RoutedEventArgs e)
{
    Console.WriteLine((this as dynamic).DataContext.text);
}

ラベルとテキストボックス それに ボタンが 2 つの UI です

ラベルは Binding でテキストボックスの値をそのまま表示しています
ソースが TextBox で ターゲットが Label です

また テキストボックスの文字列を Binding で DataContext にも反映させています
こっちは ソースが BindingData ターゲットが TextBox です

テキストボックスの文字を書き換えるとラベルと BindingData.text が更新されるはずです

ボタンのほうは書いているとおりで 上は TextBox.Text プロパティを書き換えてテキストボックスの値に今の時刻を設定してます
下側は BindingData.text をコンソールに表示します

更新されない

テキストボックスの文字を適当に変更して下のボタンを押すとちゃんと今のテキストボックスの値が表示されます


ですが 上のボタンで今の時刻をセットした後に下のボタンを押しても更新されていません
起動してすぐに上のボタン押して下のボタンを押すと 「初期値」 と表示されます

Text プロパティを書き換えは ソース➡ターゲット の通知はしても ターゲット➡ソース の通知はされないみたいです

プロパティ書き換えで通知するのは通知タイミングが PropertyChanged に設定されていた場合で デフォルトは LostFocus なので直接書き換えた場合もフォーカスはずすまで変更通知がされないからのようです

対処方法

<TextBox x:Name="textbox" Text="{Binding text, UpdateSourceTrigger=PropertyChanged}"/>

通知タイミングが LostFocus なのが原因なので Binding オプションをこうしてしまうの手もあります

こうすると変更があるたびにソースを更新します

ただ これでは文字を打っているときに 一文字入力されるたびに更新が行われます
単に代入するだけなら別にいいのですが データが許容される値かチェックしたり間に処理が入る場合 こまめに更新するのは良くない時もあります


そんなときは手動でアップデートします
更新処理のリスナをこうします
private void Button_Click(object sender, RoutedEventArgs e)
{
    this.textbox.Text = DateTime.Now.ToString("HH:mm:ss:fff");
    BindingOperations.GetBindingExpression(this.textbox, TextBox.TextProperty).UpdateSource();
}

これで上ボタン下ボタンの順で押しても更新されます