เหตุการณ์ WPF RaisePropertyChanged เมื่อสูญเสียโฟกัส

ฉันมีแอปพลิเคชัน C# WPF MVVM ที่ทำงานได้ดี

ปัญหาเดียวคือเมื่อฉันแก้ไขกล่องข้อความและคลิกที่เมนู หากฉันทำอย่างนั้นโดยไม่คลิกที่ตัวควบคุมอื่น เหตุการณ์ view->viewmodel จะไม่เริ่มทำงานเนื่องจากกล่องข้อความไม่ได้สูญเสียโฟกัส แก้ไขให้ถูกต้องหากฉันผิด แต่ฉันคิดว่า RaisePropertyChanged จะทำงานบน LostFocus เท่านั้น (หรือ OnBlur หรือเหตุการณ์ที่คล้ายกัน)

ดังนั้นการคลิกที่ปุ่มบันทึกเมนูทันทีหลังจากแก้ไขกล่องข้อความจะทำให้โมเดลมุมมองบันทึกข้อมูลโดยใช้ค่าเก่า

ดังนั้นให้ดำเนินการต่อ:

ลำดับนี้ใช้ได้ดี:

  1. แก้ไขกล่องข้อความ
  2. คลิกที่การควบคุมอื่น
  3. RaisePropertyChanged ถูกเริ่มทำงาน โมเดลมุมมองได้รับการอัปเดต
  4. คลิกที่ปุ่มบันทึกบนเมนู
  5. ข้อมูลที่บันทึกด้วยค่าที่ถูกต้อง

ลำดับนี้ทำให้ฉันมีข้อผิดพลาด:

  1. แก้ไขกล่องข้อความ
  2. คลิกที่ปุ่มบันทึกบนเมนู
  3. ข้อมูลที่บันทึกด้วยค่าที่ถูกต้อง

วิธีแก้ปัญหานี้?


person guilhermecgs    schedule 03.07.2013    source แหล่งที่มา


คำตอบ (2)


นี่เป็น gotcha ทั่วไปที่มีกล่องข้อความทั้งใน WPF และ WinForms คุณสามารถหลีกเลี่ยงปัญหานี้ได้โดยสั่งให้ระบบเชื่อมโยงอัปเดต VM พร้อมการเปลี่ยนแปลงกล่องข้อความทุกครั้ง แทนที่จะเกิดขึ้นเมื่อสูญเสียโฟกัส เมื่อต้องการทำเช่นนี้ ให้ตั้งค่า UpdateSourceTrigger ของการผูกเป็น PropertyChanged สิ่งนี้จะเขียนกลับไปยัง VM ทุกครั้งที่กล่องข้อความเพิ่มเหตุการณ์ PropertyChanged สำหรับคุณสมบัติ Text

<TextBox Text="{Binding MyText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
person Michael Gunter    schedule 03.07.2013