最后一个文本框中的更改将更新具有相同值的所有文本框

时间:2015-03-11 18:45:42

标签: validation c#-4.0 textbox wpf-4.0

我使用Gerald Gomes CodeProject文章http://www.codeproject.com/Tips/690130/Simple-Validation-in-WPF为我的WPF表单添加了一些验证 使用这个我得到一个奇怪的问题!

我有这个xaml

<Window x:Class="TestValidate.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:TestValidate"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <ControlTemplate x:Key="validationErrorTemplate">
            <DockPanel>
                <StackPanel Orientation="Horizontal" DockPanel.Dock="Top">
                    <Grid Width="12" Height="12">
                        <Ellipse Width="12" Height="12" Fill="Red" HorizontalAlignment="Center" VerticalAlignment="Center"

                             ></Ellipse>
                        <TextBlock Foreground="White" FontWeight="Heavy" FontSize="8" HorizontalAlignment="Center" VerticalAlignment="Center" TextAlignment="Center"
                               ToolTip="{Binding ElementName=ErrorAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"
                               >X</TextBlock>
                    </Grid>
                    <TextBlock Foreground="Red" FontWeight="12" Margin="2,0,0,0"
                           Text="{Binding ElementName=ErrorAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"
                           ></TextBlock>
                </StackPanel>
                <AdornedElementPlaceholder x:Name="ErrorAdorner" />
            </DockPanel>
        </ControlTemplate>
    </Window.Resources>
    <Grid RenderTransformOrigin="0.519,0.497">
        <TextBlock HorizontalAlignment="Left" Margin="36,80,0,0" TextWrapping="Wrap" Text="Number" VerticalAlignment="Top" Width="79" />
        <TextBox x:Name="MaxMessageListCount" HorizontalAlignment="Left" Height="23" Margin="120,73,0,0" TextWrapping="Wrap" VerticalAlignment="Top"
                 Width="156" Validation.ErrorTemplate="{StaticResource validationErrorTemplate}" TabIndex="4" ToolTip="Max number of messages that the list will contain before it clears">
            <TextBox.Text>
                <Binding Path="Name" Mode="TwoWay" UpdateSourceTrigger="LostFocus">
                    <Binding.ValidationRules>
                        <local:NumberValidator />
                    </Binding.ValidationRules>
                </Binding>
            </TextBox.Text>
        </TextBox>

        <TextBlock HorizontalAlignment="Left" Margin="36,126,0,0" TextWrapping="Wrap" Text="Text" VerticalAlignment="Top" Width="79" />
        <TextBox x:Name="ClientId" HorizontalAlignment="Left" Height="23" Margin="120,119,0,0" TextWrapping="Wrap" VerticalAlignment="Top"
                 Width="156"  Validation.ErrorTemplate="{StaticResource validationErrorTemplate}" TabIndex="5" ToolTip="Client Id MUST be unique for the cell">
            <TextBox.Text>
                <Binding Path="Name" Mode="TwoWay" UpdateSourceTrigger="LostFocus">
                    <Binding.ValidationRules>
                        <local:EmptyValidator />
                    </Binding.ValidationRules>
                </Binding>
            </TextBox.Text>
        </TextBox>
    </Grid>
</Window>

这些验证规则

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;

namespace TestValidate
{
    public class EmptyValidator : ValidationRule
    {
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            if (value == null)
                return new ValidationResult(false, "value can't be empty");
            else
            {
                string sValue = value.ToString();

                if (string.IsNullOrWhiteSpace(sValue))
                    return new ValidationResult(false, "Value can't be empty");
            }
            return ValidationResult.ValidResult;
        }
    }

    public class NumberValidator : ValidationRule
    {
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            if (value == null)
                return new ValidationResult(false, "value can't be empty");
            else
            {
                if (!IsNumeric(value))
                    return new ValidationResult(false, "value must be a number");
            }
            return ValidationResult.ValidResult;
        }

        private bool IsNumeric(object value)
        {
            bool result = true;
            string number = value.ToString();
            int num = -1;
            result = int.TryParse(number, out num);

            return result;
        }
    }
}

如果我更改了最后一个文本框的值(x:Name =“ClientId”),则输入的值也将填入第一个textbos(x:Name =“MaxMessageListCount”)

我做错了什么?

整个项目可以从这里下载 http://andis59.se/wpf/TestValidate.zip

// Anders

1 个答案:

答案 0 :(得分:2)

您将两个TextBox绑定到&#39; Name&#39;属性,

<Binding Path="Name" Mode="TwoWay" UpdateSourceTrigger="LostFocus">

例如,在您的情况下,我将ClientId TextBox绑定到

<Binding Path="ClientId" Mode="TwoWay" UpdateSourceTrigger="LostFocus">