実現したいこと
データバインディングの勉強中です。
ボタンプッシュイベント中にC#側の値変更を、表示側に反映したいです。
よろしくお願い致します。
該当のソースコード
xaml
1<Window x:Class="DataBindingTest.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:DataBindingTest" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="450" Width="800"> 9 <Grid> 10 <TextBox 11 Text="{Binding Input}" 12 HorizontalAlignment="Left" Height="23" Margin="30,25,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/> 13 14 <Button 15 Content="Set" 16 Click="SetButton_Click" 17 Margin="200,25,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Width="100"/> 18 </Grid> 19</Window>
C#
1namespace DataBindingTest 2{ 3 public partial class MainWindow : Window 4 { 5 private MainWindowViewModel ViewModel = new MainWindowViewModel(); 6 public MainWindow() 7 { 8 InitializeComponent(); 9 DataContext = ViewModel; 10 } 11 12 private void SetButton_Click(object sender, RoutedEventArgs e) 13 { 14 ViewModel.Input = "test"; 15 ... Do something // <= ここで次の処理までに表示側に「test」を反映 16 } 17 } 18 19 public class MainWindowViewModel : INotifyPropertyChanged 20 { 21 public event PropertyChangedEventHandler PropertyChanged; 22 private void RaisePropertyChanged([CallerMemberName]string propertyName = null) 23 => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 24 25 string _Input; 26 public string Input 27 { 28 get { return _Input; } 29 set { if (_Input != value) { _Input = value; RaisePropertyChanged(); } } 30 } 31 } 32}
発生している問題
当初PropertyChangedが終わった直後に表示側でも変更が反映されると思っていました。
試しにボタンプッシュイベントからVisual Studioのブレークポイントを使って一行ずつステップオーバーし、いつ反映されるか確認したところ、イベント終了後に表示側で反映されました。
質問
- データバインディングは、イベント終了後に変更が反映されるものなのでしょうか。
- もしそうでないなら、どのように書き直せばよいでしょうか。
補足情報
統合開発環境: Visual studio 2019
回答1件
あなたの回答
tips
プレビュー