5

TextBox値とをチェックする必要があるWPFアプリケーションがありComboBoxます。それが空であるか、フォーマット上にない場合、ボタンクリックイベントはエラーを発生させるはずであり、選択されたインデックスがComboBox再び0である場合、エラーを発生させるはずです(エラープロバイダーのように)。

私はインターネットで多くの調査を行い、 IDataErrorInfoを使用したソリューションに出くわしました。しかし、問題は、ボタンクリックイベントでこれをどのように行うかです。すべての例は、フォームのロードでそれを実行しています。

私はWPFにまったく慣れていません。以下は私のコードです

public class ClientMap : IDataErrorInfo
{
    public string CDSNo { get; set; }

    public ClientMap(int ID)
    {
        Id = ID;
    }
    public ClientMap()
    {

    }

    public string Error
    {
        get { throw new NotImplementedException(); }
    }

    public string this[string columnName]
    {
        get
        {
            string result = null;
            if (columnName == "CDSNo")
            {
                if (string.IsNullOrEmpty(CDSNo))
                    result = "Please enter a CDS No";
                else
                {
                    string regEx = "[A-Z]{3}-\\d{9}-[A-Z]{2}-\\d{2}";
                    if (!Regex.IsMatch(CDSNo, regEx))
                    {
                        result = "Invalid CDS No";
                    }
                }
            }

            return result;
        }
    }

    public int Id { get; set; }
    public CE.Data.Customer Customer { get; set; }
    public CE.Data.Institute Institute { get; set; }
    public bool Archived { get; set; }
    public DateTime DateCreated { get; set; }

}

XAMLは

<Window.Resources>
    <validation:ClientMap x:Key="data"/>
</Window.Resources>

<control:AutoCompleteTextBox Style="{StaticResource textBoxInError}">
    <TextBox.Text>
        <Binding Path="CDSNo" Source="{StaticResource data}"
                ValidatesOnDataErrors="True"   
                UpdateSourceTrigger="Explicit">

            <Binding.ValidationRules>
                <ExceptionValidationRule/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</control:AutoCompleteTextBox>

私を助けてください。ありがとう

4

1 に答える 1

9

これは、この記事から変更されたコードです。そのサイトから入手できるダウンロードから参照と追加のクラスを取得する必要があります。

Window1.xaml

<Window x:Class="SOTCBindingValidation.Window1" x:Name="This"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:SOTCBindingValidation"
    Title="SOTC Validation Test" Height="184" Width="390">
    <Window.Resources>
        <local:ErrorsToMessageConverter x:Key="eToMConverter" />
    </Window.Resources>
    <StackPanel Margin="5">
        <TextBlock Margin="2">Enter An IPv4 Address:</TextBlock>
            <TextBox x:Name="AddressBox">
                <TextBox.Text>
                    <Binding ElementName="This" Path="IPAddress" 
                             UpdateSourceTrigger="Explicit">
                        <Binding.ValidationRules>
                            <local:IPv4ValidationRule />
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox.Text>
            </TextBox>
        <TextBlock Margin="2" Foreground="Red" FontWeight="Bold" 
            Text="{Binding ElementName=AddressBox, 
                          Path=(Validation.Errors),
                          Converter={StaticResource eToMConverter}}" />
            <Button Name="Btn1" Height ="30" Width="70" Click="Btn1_Click"></Button>
    </StackPanel>

</Window>

Window1.xaml.cs

using System.Windows;
using System.Windows.Controls;
namespace SOTCBindingValidation
{

    public partial class Window1 : Window
    {
        public static readonly DependencyProperty IPAddressProperty =
            DependencyProperty.Register("IPAddress", typeof(string),
            typeof(Window1), new UIPropertyMetadata(""));

        public string IPAddress
        {
            get { return (string)GetValue(IPAddressProperty); }
            set { SetValue(IPAddressProperty, value); }
        }

        public Window1()
        { InitializeComponent(); }

        private void Btn1_Click(object sender, RoutedEventArgs e)
        {
            ForceValidation();
            if (!Validation.GetHasError(AddressBox))
            {
                // Put the code you want to execute if the validation succeeds here
            }
        }
        private void ForceValidation()
        {
            AddressBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
        }

    }
}
于 2012-12-23T23:49:44.837 に答える