textbox.textchanged イベントに問題があります。私のテキストボックスはデータバインドされており、ページが読み込まれると、textchanged イベントがトリガーされます。それが起こらないようにするにはどうすればよいですか?ユーザーが何らかの変更を加えたときにのみトリガーされますか?
4 に答える
textchanged イベント ハンドラー内で、ウィンドウ (またはユーザー コントロールなど) が読み込まれているかどうかを確認できます。
if (this.IsLoaded)
{
//your logic here
}
このようにして、ウィンドウがまだロードされていないときに、TextChanged イベントの最初の発生をスキップできます。
問題は、テキストが設定されるたびに TextChanged がトリガーされることです。それがまさにWPFの仕組みです。Window/Usercontrol の Loaded イベントをサブスクライブすることにより、codebehind でイベントを設定することにより、これを「修正」できます。Loaded イベントは、すべての子とその子が読み込みを完了し、表示する準備ができた後に発生します。
<UserControl ---- Loaded="UserControl_Loaded">
-
public void UserControl_Loaded(object sender, RoutedEventArgs e)
{
_txtBox.TextChanged += txt_changed;
}
public void txt_changed(object sender, RoutedEventArgs e)
{
(...)
}
さて、あなたのコメントから、ユーザーが明示的にフォームを保存または閉じるときに、基になるデータにのみ反映される変更をユーザーに加えてもらいたいと思います。
ここでUpdateSourceTrigger "Explicit"を使用できます。
<TextBox Text={Binding MyData, UpdateSourceTrigger=Explicit}/>
したがって、変更は、ユーザーが保存ボタンを押したときにバインドで UpdateSource を明示的に呼び出すことによってのみ伝達されます。
MVVM を使用する場合は、同じロジックをコードごとに ViewModel に実装することもできます。