代码之家  ›  专栏  ›  技术社区  ›  Jordan

表示不属于数据绑定控件的控件中的验证错误?

  •  3
  • Jordan  · 技术社区  · 14 年前

    我有一个 TextBlock DockPanel Border 控件 是数据绑定的,可以使用屏幕键盘进行更改。因此,我把它与验证连接起来,它工作得非常好。我的困境是我似乎只能改变 出现验证错误时的样式。我想触发 边界 的风格。我该怎么做?

    ErrorContents 其他地方的风景?

    2 回复  |  直到 14 年前
        1
  •  3
  •   ChrisNel52    14 年前

    从其他控件绑定到你的文本框。下面我将标签的内容属性绑定到文本框的(Validation.Errors)[0].ErrorContent属性。

    <DockPanel>
    
        <!-- TextBox bound to a data object-->
        <TextBox Name="textBox1" DockPanel.Dock="Top" Text="{Binding Path=Age, ValidatesOnExceptions=True, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"></TextBox>
    
        <!-- A label that displays the errors from textBox1 -->
        <Label Content="{Binding ElementName=textBox1, Path=(Validation.Errors)[0].ErrorContent}"></Label>
    
    </DockPanel>
    
        2
  •  1
  •   klm_    14 年前

    我想这能解决你的问题:

    Xaml:

    <Window x:Class="WpfErrorsBorderColor.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:WpfErrorsBorderColor="clr-namespace:WpfErrorsBorderColor" Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Style x:Key="{x:Type WpfErrorsBorderColor:MyControl}" TargetType="{x:Type WpfErrorsBorderColor:MyControl}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="WpfErrorsBorderColor:MyControl"  >
                        <Border Name="bd" >
                            <DockPanel LastChildFill="True"  >
                                <TextBox Text="{Binding Path=Description,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" DockPanel.Dock="Top"/>
                                <TextBlock Name="textBlock" Text="{Binding Path=Description,ValidatesOnDataErrors=True,NotifyOnValidationError=True}"></TextBlock>
                            </DockPanel>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger SourceName="textBlock" Property="Validation.HasError" Value="True">
                                <Setter TargetName="bd" Property="BorderBrush" Value="Red" />
                                <Setter TargetName="bd" Property="BorderThickness" Value="4" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <WpfErrorsBorderColor:MyControl></WpfErrorsBorderColor:MyControl>
    

    代码:

        using System;
    using System.Windows;
    using System.Windows.Controls;
    using System.ComponentModel;
    
    namespace WpfErrorsBorderColor
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
    
                Data data = new Data() { Description = "123" };
    
                DataContext = data;
            }
        }
    
        public class Data : IDataErrorInfo, INotifyPropertyChanged
        {
            private string description;
            public string Description
            {
                get { return description; }
                set
                {
                    if (description != value)
                    {
                        description = value;
    
                        if (PropertyChanged != null)
                            PropertyChanged(this, new PropertyChangedEventArgs("Description"));
                    }
                }
            }
    
            string CheckLenght(string str)
            {
                return (str.Length < 1 || str.Length > 10) ? "Strign must be between 1 and 10 letters" : String.Empty;
            }
    
    
            public string Error
            {
                get { return CheckLenght(Description); }
            }
    
            public string this[string columnName]
            {
                get { return CheckLenght(Description); }
            }
    
            #region INotifyPropertyChanged Members
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            #endregion
        }
    
        public class MyControl:UserControl
        {
            public MyControl()
            {
    
            }
        }
    }
    

    你可以用同样的方式绑定;)