2

キーが押されたときにテキストボックス内のテキストを検証しようとしています。これが私がやろうとしていることを示す最短のコードサンプルです:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TextBox FontSize="15" HorizontalAlignment="Left" Name="txtEmail" VerticalAlignment="Top" Width="135"
                 Text="{Binding ValidationRules.EmailAddress, ValidatesOnExceptions=True, UpdateSourceTrigger=PropertyChanged}"/>
    </Grid>
</Window>

「ValidationRules」クラス:

 class ValidationRules
    {
        string email = "";
        public string EmailAddress
        {
            get
            {
                return email;
            }

            set
            {
                Console.WriteLine("Setting!");
                //Only check if there is any text for now...
                if (String.IsNullOrWhiteSpace(value))
                {
                    throw new Exception();
                }

                email = value;
            }
        }

    }

テキストボックスに入力し始めると、を使用していても、コンソール出力として「設定」が表示されませんUpdateSourceTrigger=PropertyChanged。私は自分の調査を行いましたが、私が見つけたすべての例は長く曲がりくねっていて混乱しています。また、検証で私が持っている他の間違いを指摘していただければ幸いですが、私はWPFを初めて使用するため、可能であれば簡単な言葉で説明するようにしてください。

4

1 に答える 1

3

これは、DataContextをどこに設定するかに関する問題である必要があります。

この例はうまく機能しているようです:

コード:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public MainWindow()
    {
        InitializeComponent();
        ValidationRules = new ValidationRules();
    }

    private ValidationRules _validation;
    public ValidationRules ValidationRules
    {
        get { return _validation; }
        set { _validation = value; NotifyPropertyChanged("ValidationRules"); }
    }


    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
 }

public class ValidationRules : INotifyPropertyChanged
{
    string email = "";
    public string EmailAddress
    {
        get
        {
            return email;
        }

        set
        {
            Console.WriteLine("Setting!");
            //Only check if there is any text for now...
            if (String.IsNullOrWhiteSpace(value))
            {
                throw new Exception();
            }
            email = value;
            NotifyPropertyChanged("EmailAddress");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }

}

Xaml

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Class="WpfApplication1.MainWindow"
        Title="MainWindow" Height="125.078" Width="236.441" x:Name="UI" >
    <Grid DataContext="{Binding ElementName=UI}">
        <TextBox FontSize="15" HorizontalAlignment="Left" Name="txtEmail" VerticalAlignment="Top" Width="135"
                 Text="{Binding ValidationRules.EmailAddress, ValidatesOnExceptions=True, UpdateSourceTrigger=PropertyChanged}"/>
    </Grid>
</Window>
于 2013-02-12T00:06:55.533 に答える