การตรวจสอบข้อมูลที่เข้มงวดใน WPF TextBoxes

เมื่อทำงานกับแอปพลิเคชันที่มีการเชื่อมโยงข้อมูลใน Windows Presentation Foundation (WPF) การตรวจสอบข้อมูลเป็นสิ่งสำคัญเพื่อให้แน่ใจว่าการป้อนข้อมูลของผู้ใช้ถูกต้องและปลอดภัย หนึ่งในสถานการณ์ทั่วไปเกี่ยวข้องกับ TextBox ที่เชื่อมโยงกับคุณสมบัติทศนิยมที่สามารถเป็นค่าว่างได้ เช่น ความสูง อย่างไรก็ตาม ปัญหาจะเกิดขึ้นเมื่อ TextBox สามารถสูญเสียโฟกัสได้แม้ว่าจะมีการป้อนค่าที่ไม่ถูกต้อง ในบทความนี้เราจะสำรวจกลยุทธ์ที่มีประสิทธิภาพในการนำการตรวจสอบที่เข้มงวดมาใช้ใน WPF โดยเน้นเฉพาะสองวิธีหลักในการจัดการสถานะการป้อนข้อมูลของ TextBox

ปัญหา: การรับประกันการป้อนข้อมูลของผู้ใช้ที่ถูกต้อง

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

  1. ป้องกันไม่ให้ TextBox สูญเสียโฟกัสจนกว่าจะมีค่าที่ถูกต้อง
  2. คืนค่าเนื้อหา TextBox เป็นค่าที่ถูกต้องล่าสุดเมื่อมันสูญเสียโฟกัสพร้อมกับการป้อนข้อมูลที่ไม่ถูกต้อง

วิธีแก้ไขที่ 1: ป้องกันการสูญเสียโฟกัส

วิธีที่มีประสิทธิภาพในการรักษาโฟกัสไว้ที่ TextBox จนกว่าจะมีการป้อนข้อมูลที่ถูกต้องคือการจัดการเหตุการณ์ PreviewLostKeyboardFocus วิธีนี้เกี่ยวข้องกับการบล็อกการเปลี่ยนโฟกัสอย่างเป็นโปรแกรมเมื่อมีการตรวจพบสถานะที่ไม่ถูกต้อง นี่คือวิธีที่คุณสามารถนำวิธีแก้ไขนี้ไปใช้:

การนำไปใช้ XAML

ก่อนอื่นให้เพิ่มการจัดการเหตุการณ์สำหรับ PreviewLostKeyboardFocus ในการกำหนด TextBox ของคุณ:

<TextBox PreviewLostKeyboardFocus="TextBox_PreviewLostKeyboardFocus" 
         Text="{Binding Height, UpdateSourceTrigger=PropertyChanged, 
                         ValidatesOnExceptions=True, 
                         Converter={StaticResource NullConverter}}" />

การนำไปใช้ C#

ถัดไป ให้คุณต้องนำการจัดการเหตุการณ์นี้ไปใช้ในโค้ดเบื้องหลังของคุณเพื่อป้องกันการสูญเสียโฟกัส:

private void TextBox_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) {
    TextBox box = sender as TextBox;
    var binding = box.GetBindingExpression(TextBox.TextProperty);
    
    // ตรวจสอบข้อผิดพลาดในการตรวจสอบ
    if (binding.HasError) {
        // บล็อกการเปลี่ยนโฟกัส
        e.Handled = true;
    }
}

โดยการใช้วิธีนี้ TextBox จะไม่อนุญาตให้สูญเสียโฟกัสจนกว่าผู้ใช้จะป้อนค่าทศนิยมที่ถูกต้อง นี่จะช่วยให้มั่นใจในความสมบูรณ์ของข้อมูลในระหว่างขั้นตอนการป้อนข้อมูล

วิธีแก้ไขที่ 2: คืนค่ากลับไปยังค่าที่ถูกต้องล่าสุด

อีกวิธีหนึ่งคือการคืนค่าเนื้อหา TextBox เป็นค่าที่ถูกต้องล่าสุดเมื่อสูญเสียโฟกัส วิธีนี้อาจมีประโยชน์โดยเฉพาะในแอปพลิเคชันที่ใช้งานง่ายซึ่งการรักษาสถานะที่ถูกต้องล่าสุดเป็นสิ่งที่ต้องการ

วิธีที่มีอยู่

คุณอาจได้ทำการนำเสนอแบบพื้นฐานของสิ่งนี้ในตัวจัดการเหตุการณ์ LostKeyboardFocus เพื่อให้คลอบคลุม นี่คือวิธีที่สามารถจัดโครงสร้างได้:

private void TextBox_LostKeyboardFocus(object sender, RoutedEventArgs e) {
    TextBox box = sender as TextBox;
    var binding = box.GetBindingExpression(TextBox.TextProperty);
    
    if (binding.HasError) {
        binding.UpdateTarget(); // คืนค่ากลับไปยังค่าที่ถูกต้องล่าสุด
    }
}

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

สรุป

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

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