2008-11-26 7 views
21

मेरे पास एक ऐसी स्थिति है जहां मैं अपवाद ValidationRule का उपयोग कर wpf डेटा बाध्यकारी और सत्यापन का उपयोग कर रहा हूं।जब मेरी डब्ल्यूपीएफ बाइंडिंग सत्यापन विफल हो गई है और इसमें पैनल अब दिखाई नहीं दे रहा है तो मैं लाल आयताकार से कैसे छुटकारा पा सकता हूं?

समाधान का एक और हिस्सा कुछ पैनलों को ध्वस्त करने और दूसरों को दिखाने का आह्वान करता है।

यदि कोई सत्यापन अपवाद सेट किया गया है - यानी यूआई सत्यापन तत्व के साथ UI तत्व के चारों ओर एक लाल सीमा दिखा रहा है, और युक्त पैनल ध्वस्त हो गया है, तो लाल सीमा अभी भी प्रदर्शित होती है। यह स्पष्ट रूप से होने का मतलब नहीं है? क्या इसके आसपास कोई कार्य है? किसी को पता है कि यह डिजाइन द्वारा है या नहीं?

न्यूनतम कोड उदाहरण प्रदान किया गया (मेरा वास्तविक कोड नहीं, लेकिन समस्या को दोहराता है)। एक नया Wpf अनुप्रयोग बनाएं (मैंने मेरा WpfDataBindingProblem कहा है)। इस प्रकार

<Window x:Class="WpfDataBindingProblem.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel Margin="5"> 

     <StackPanel Name="panel1" Visibility="Visible" Margin="5"> 
      <TextBox Name="DataBoundTextBox"> 
       <Binding Path="TextValue"> 
        <Binding.ValidationRules> 
         <ExceptionValidationRule/> 
        </Binding.ValidationRules> 
       </Binding> 
      </TextBox> 
     </StackPanel> 

     <StackPanel Name="panel2" Visibility="Collapsed" Margin="5"> 
      <TextBlock> 
       The quick brown fox jumps over the lazy dog. 
      </TextBlock> 
     </StackPanel> 

     <Button Click="Button_Click" Margin="5"> 
      Toggle panels 
     </Button> 

    </StackPanel> 
</Window> 

window1 के लिए कोड है::

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace WpfDataBindingProblem { 

    public partial class Window1 : Window { 
     public Window1() { 
      InitializeComponent(); 

      this.DataContext = new MyClass("default"); 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) { 
      panel1.Visibility = panel1.Visibility == Visibility.Collapsed ? 
       Visibility.Visible : Visibility.Collapsed; 
      panel2.Visibility = panel2.Visibility == Visibility.Collapsed ? 
       Visibility.Visible : Visibility.Collapsed; 
     } 
    } 

    public class MyClass : INotifyPropertyChanged { 

     private string mTextValue; 

     public MyClass(string defaultText) { 
      TextValue = defaultText; 
     } 

     public string TextValue { 
      get { 
       return mTextValue; 
      } 
      set { 
       mTextValue = value; 
       if (string.IsNullOrEmpty(mTextValue)) { 
        throw new ApplicationException("Text value cannot be empty"); 
       } 
       OnPropertyChanged(new PropertyChangedEventArgs("TextValue")); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) { 
      if (this.PropertyChanged != null) { 
       this.PropertyChanged(this, e); 
      } 
     } 
    } 

} 

समस्या को पुन: करने के लिए, एप्लिकेशन को चलाने के

window1 के लिए XAML इस प्रकार है। टेक्स्टबॉक्स और टैब ऑफ से डिफ़ॉल्ट टेक्स्ट हटाएं - लाल आयत एक सत्यापन समस्या का संकेत दिखाया गया है। बटन को क्लिक करे। लाल आयत के साथ नियंत्रण युक्त पैनल छिपा हुआ है और दूसरा पैनल दिखाया गया है, लेकिन लाल आयताकार बनी हुई है। Aargh!

सभी मदद की बहुत सराहना की।

लंबे प्रश्न शीर्षक के लिए पीएस माफ़ी!

उत्तर

22

अगर मैं सही ढंग से याद है, यह एक ज्ञात समस्या है। हम फिर से टेम्प्लेट पाठ बॉक्स में निम्न शामिल हैं:

<Setter Property="Validation.ErrorTemplate"> 
    <Setter.Value> 
     <ControlTemplate> 
      <ControlTemplate.Resources> 
       <BooleanToVisibilityConverter x:Key="converter" /> 
     </ControlTemplate.Resources> 
      <DockPanel LastChildFill="True"> 
       <Border 
        BorderThickness="1" 
        BorderBrush="Red" 
        Visibility="{Binding ElementName=placeholder, Mode=OneWay, Path=AdornedElement.IsVisible, Converter={StaticResource converter}}"> 
        <AdornedElementPlaceholder x:Name="placeholder" /> 
       </Border> 
      </DockPanel> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 
+0

Donnelle, यह शानदार है! वास्तव में मुझे क्या चाहिए। बहुत धन्यवाद, सैम –

+0

आपका स्वागत है। मदद करने में खुशी! – Donnelle

+0

यह आश्चर्यजनक सरल है। धन्यवाद!!! – Pwninstein

1

मैं इस समस्या अपने आप को मेरे बटन क्लिक करें घटना जो पैनलों की दृश्यता में परिवर्तन बदलने के लिए है जो करने के लिए एक जवाब है। यह कुछ इस तरह करने के लिए बदल जाएगा:

private void Button_Click(object sender, RoutedEventArgs e) { 
    if (panel1.Visibility == Visibility.Collapsed) { 
     panel1.Visibility = Visibility.Visible; 
     DataBoundTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource(); 
     panel2.Visibility = Visibility.Collapsed; 
    } 
    else { 
     panel1.Visibility = Visibility.Collapsed; 
     DataBoundTextBox.GetBindingExpression(TextBox.TextProperty).UpdateTarget(); 
     panel2.Visibility = Visibility.Visible; 
    } 
} 

UpdateSource() और UpdateTarget() फिर से आवेदन करने और लाल आयत को हटाने का प्रभाव है, लेकिन यह एक बदसूरत हैक की तरह लगता है। निश्चित रूप से डब्ल्यूपीएफ ढांचे को मेरे लिए लाल आयताकार छिपाना चाहिए जब युक्त पैनल ढह गया हो। कोई भी क्लीनर फिक्स जो मुझे बाध्यकारी अभिव्यक्ति के साथ परेशान करने की आवश्यकता नहीं है, मेरा वोट प्राप्त करता है।

धन्यवाद,

सैम

संबंधित मुद्दे