แนวทางปฏิบัติที่ดีที่สุดสำหรับการผูกข้อมูลและการตรวจสอบความถูกต้องของ WPF


101

ฉันมีแอปพลิเคชัน WPF ที่ง่ายมากซึ่งฉันใช้การผูกข้อมูลเพื่ออนุญาตให้แก้ไขวัตถุ CLR ที่กำหนดเองบางอย่าง ตอนนี้ฉันต้องการใส่การตรวจสอบอินพุตเมื่อผู้ใช้คลิกบันทึก อย่างไรก็ตามหนังสือ WPF ทั้งหมดที่ฉันอ่านไม่ได้ให้ความสำคัญกับปัญหานี้เลย ฉันเห็นว่าคุณสามารถสร้าง ValidationRules ที่กำหนดเองได้ แต่ฉันสงสัยว่านี่จะเกินความต้องการของฉันหรือไม่

คำถามของฉันคือ: มีแอปพลิเคชันหรือบทความตัวอย่างที่ดีที่ไหนสักแห่งที่แสดงแนวทางปฏิบัติที่ดีที่สุดในการตรวจสอบความถูกต้องของข้อมูลผู้ใช้ใน WPF หรือไม่

คำตอบ:


83

ฉันคิดว่าวิธีใหม่ที่ต้องการคือการใช้ IDataErrorInfo

อ่านเพิ่มเติมที่นี่


3
ฉันยังพบ Cinch framework ( cinch.codeplex.com ) ซึ่งรวมถึงการสาธิตการตรวจสอบแนวทางปฏิบัติที่ดีที่สุดใน WPF + MVVM และใช้ IDataErrorInfo
Mark Heath

3
ใน. NET 4.5 คุณสามารถใช้ INotifyErrorInfo ซึ่งอนุญาตให้คุณส่งคืนอ็อบเจ็กต์แทนที่จะเป็นเพียงสตริง
ปีเตอร์

24

จากเอกสารPatterns & Practicesของ MS :

การตรวจสอบข้อมูลและการรายงานข้อผิดพลาด

แบบจำลองมุมมองของคุณมักจะต้องดำเนินการตรวจสอบข้อมูลและส่งสัญญาณข้อผิดพลาดในการตรวจสอบข้อมูลไปยังข้อมูลพร็อพเพอร์ตี้เพื่อให้ผู้ใช้สามารถดำเนินการแก้ไขได้

Silverlight และ WPF ให้การสนับสนุนสำหรับการจัดการข้อผิดพลาดในการตรวจสอบข้อมูลที่เกิดขึ้นเมื่อเปลี่ยนคุณสมบัติแต่ละอย่างที่ถูกผูกไว้กับตัวควบคุมในมุมมอง สำหรับคุณสมบัติเดี่ยวที่เชื่อมโยงข้อมูลกับตัวควบคุมโมเดลมุมมองหรือโมเดลสามารถส่งสัญญาณข้อผิดพลาดในการตรวจสอบข้อมูลภายในตัวตั้งค่าคุณสมบัติโดยการปฏิเสธค่าที่ไม่ถูกต้องที่เข้ามาและทิ้งข้อยกเว้น ถ้าคุณสมบัติ ValidatesOnExceptions บนการผูกข้อมูลเป็นจริงกลไกการผูกข้อมูลใน WPF และ Silverlight จะจัดการข้อยกเว้นและแสดงสัญญาณภาพให้ผู้ใช้ทราบว่ามีข้อผิดพลาดในการตรวจสอบข้อมูล

อย่างไรก็ตามควรหลีกเลี่ยงการทิ้งข้อยกเว้นที่มีคุณสมบัติในลักษณะนี้หากเป็นไปได้ อีกวิธีหนึ่งคือการใช้อินเทอร์เฟซ IDataErrorInfo หรือ INotifyDataErrorInfo บนโมเดลมุมมองหรือคลาสโมเดลของคุณ อินเทอร์เฟซเหล่านี้อนุญาตให้โมเดลมุมมองหรือแบบจำลองของคุณดำเนินการตรวจสอบข้อมูลสำหรับค่าคุณสมบัติตั้งแต่หนึ่งค่าขึ้นไปและส่งคืนข้อความแสดงข้อผิดพลาดไปยังมุมมองเพื่อให้ผู้ใช้ได้รับแจ้งข้อผิดพลาด

เอกสารประกอบอธิบายวิธีการใช้ IDataErrorInfo และ INotifyDataErrorInfo


3
ฉันกังวลในตอนแรกเมื่อเห็นข้อเสนอแนะข้อยกเว้น ดีใจที่เห็นว่าตามด้วย "การทิ้งข้อยกเว้นที่มีคุณสมบัติในลักษณะนี้ควรหลีกเลี่ยงหากเป็นไปได้"
kenwarner

22
ควรสังเกตด้วยว่า muppet บางตัวที่ microsoft ตัดสินใจที่จะไม่รวม INotifyDataErrorInfo ใน. net4 แต่เป็นเฉพาะใน silverlight มันปวด ..
aL3891

5
@ al3891- จะเรียงลำดับใน. NET 4.5- msdn.microsoft.com/en-us/library/…
RichardOD

@ aL3891 มีทางเลือกอื่นสำหรับ INotifyDataErrorInfo ที่หายไปหรือไม่?
AgentKnopf

10

ส่วนตัวฉันใช้ข้อยกเว้นเพื่อจัดการการตรวจสอบความถูกต้อง ต้องมีขั้นตอนต่อไปนี้:

  1. ในนิพจน์การผูกข้อมูลของคุณคุณต้องเพิ่ม "ValidatesOnException = True"
  2. ในอ็อบเจ็กต์ข้อมูลที่คุณกำลังผูกมัดคุณต้องเพิ่ม DependencyPropertyChanged handler ที่คุณตรวจสอบว่าค่าใหม่ตรงตามเงื่อนไขของคุณหรือไม่ - ถ้าไม่ - คุณจะคืนค่าเป็นค่าเดิมของอ็อบเจ็กต์ (ถ้าคุณต้องการ) และคุณโยนข้อยกเว้น
  3. ในเทมเพลตการควบคุมของคุณที่คุณใช้สำหรับการแสดงค่าที่ไม่ถูกต้องในตัวควบคุมคุณสามารถเข้าถึงการรวบรวมข้อผิดพลาดและแสดงข้อความข้อยกเว้น

เคล็ดลับที่นี่คือการผูกเฉพาะกับวัตถุที่มาจาก DependencyObject การใช้ INotifyPropertyChanged อย่างง่ายจะไม่ทำงาน - มีข้อบกพร่องในกรอบซึ่งป้องกันไม่ให้คุณเข้าถึงการรวบรวมข้อผิดพลาด


3

ตรวจสอบบทความนี้ด้วย สมมติว่า Microsoft เปิดตัวEnterprise Library (v4.0)จากรูปแบบและแนวปฏิบัติที่ครอบคลุมเรื่องการตรวจสอบความถูกต้อง แต่พระเจ้าทรงทราบว่าเหตุใดจึงไม่รวมการตรวจสอบความถูกต้องสำหรับ WPF ดังนั้นบล็อกโพสต์ที่ฉันนำคุณไปจะอธิบายถึงสิ่งที่ผู้เขียน ไม่ได้ดัดแปลงมัน หวังว่านี่จะช่วยได้!


2

คุณอาจจะสนใจในBookLibraryโปรแกรมตัวอย่างของWPF Application Framework (WAF) แสดงวิธีใช้การตรวจสอบความถูกต้องใน WPF และวิธีควบคุมปุ่มบันทึกเมื่อมีข้อผิดพลาดในการตรวจสอบความถูกต้อง


0

ถ้าชั้นธุรกิจของคุณถูกใช้โดยตรงโดย UI ของคุณควรใช้ IDataErrorInfo เนื่องจากทำให้ตรรกะใกล้ชิดกับเจ้าของมากขึ้น

หากคลาสธุรกิจของคุณเป็นคลาสสตับที่สร้างขึ้นโดยการอ้างอิงถึงบริการ WCF / XmlWeb คุณจะไม่สามารถ / ต้องไม่ใช้ IDataErrorInfo หรือโยน Exception เพื่อใช้กับ ExceptionValidationRule แต่คุณสามารถ:

  • ใช้ ValidationRule ที่กำหนดเอง
  • กำหนดคลาสบางส่วนในโปรเจ็กต์ WPF UI ของคุณและใช้ IDataErrorInfo

1
ฉันรู้ว่ามันเก่า แต่ฉันหวังว่าอเล็กซ์จะสามารถตอบสนองได้ นี่เป็นข้อสรุปที่ฉันได้รับเช่นกัน แต่ปัญหาคือคุณต้องเขียนการตรวจสอบความถูกต้องสำหรับ (สำหรับตัวอย่าง) คุณสมบัติ "อายุ" ที่ไม่สามารถใหญ่กว่า 100 ใน ValidationRule จากนั้นทำซ้ำตรรกะเดียวกันในอินเทอร์เฟซ IDataErrorInfo ซึ่งมีตรรกะซ้ำกัน มีวิธีใดบ้าง?
JFTxJ

คุณทำซ้ำตรรกะที่ไหน ในการตรวจสอบเซิร์ฟเวอร์บางประเภท? ฉันเดาตามความคิดเห็นของคุณว่าคุณกำลังตรวจสอบความถูกต้องด้วย IDataErrorInfo ใน UI และทำซ้ำการตรวจสอบความถูกต้องในวัตถุทางธุรกิจใช่ไหม ถ้าเป็นเช่นนั้นการตรวจสอบความถูกต้องทั้งสองด้านก็ถูกต้อง วัตถุทางธุรกิจไม่สามารถเชื่อถือ UI และต้องดำเนินการตรวจสอบความถูกต้องของตัวเอง (แม้ว่าจะดูเหมือนซ้ำกัน)
Alex Pollan

ไม่การทำซ้ำของตรรกะการตรวจสอบความถูกต้องอยู่ใน IDataErrorInfo และในกฎการตรวจสอบความถูกต้องที่กำหนดเอง ... เนื่องจากกฎการตรวจสอบความถูกต้องแบบกำหนดเองเป็นวิธีเดียวในการตรวจสอบความถูกต้องของข้อมูลก่อนที่จะมีการอัปเดตเป็นวัตถุที่ถูกผูกไว้จริงการตรวจสอบความถูกต้องนั้น (อายุต้องต่ำกว่า จากนั้น 100) จำเป็นต้องกำหนดไว้ใน IDataErrorInfo เพื่อส่งคืนข้อความ "ต่อฟิลด์" แต่ต้องนำไปใช้ในกฎการตรวจสอบความถูกต้องที่กำหนดเองด้วย มีเหตุผล?
JFTxJ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.