代码之家  ›  专栏  ›  技术社区  ›  Sam Meldrum

当我的wpf绑定验证失败并且包含的面板不再可见时,如何去掉红色矩形?

  •  21
  • Sam Meldrum  · 技术社区  · 17 年前

    我遇到的情况是,我使用wpf数据绑定,并使用ExceptionValidationRule进行验证。

    提供了最少的代码示例(不是我的实际代码,但复制了问题)。创建一个新的WPF应用程序(我称之为我的WpfDataBindingProblem)。

    window1的xaml如下所示:

    <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>
    

    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);
                }
            }
        }
    
    }
    

    违约 显示文本框和选项卡关闭红色矩形中的文本,表示存在验证问题。点击按钮。包含红色矩形控件的面板将隐藏,并显示另一个面板,但红色矩形仍保留。啊!

    非常感谢大家的帮助。

    2 回复  |  直到 17 年前
        1
  •  23
  •   devdigital    15 年前

    如果我没记错的话,这是一个已知的问题。我们重新模板化了textbox,以包括以下内容:

    <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>
    
        2
  •  1
  •   Sam Meldrum    17 年前

    我自己有一个问题的答案,那就是改变我的按钮点击事件,它改变了面板的可见性。这会变成这样:

    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;
        }
    }
    

    这个 UpdateTarget()

    谢谢

    山姆

    推荐文章