BindingExpressionBase.ValidateWithoutUpdate メソッド

定義

ValidationRule プロパティが Binding または ValidationStep に設定されている任意の RawProposedValue オブジェクトを、関連する ConvertedProposedValue に実行します。Runs any ValidationRule objects on the associated Binding that have the ValidationStep property set to RawProposedValue or ConvertedProposedValue. このメソッドはソースを更新しません。This method does not update the source.

public:
 bool ValidateWithoutUpdate();
public bool ValidateWithoutUpdate ();
member this.ValidateWithoutUpdate : unit -> bool
Public Function ValidateWithoutUpdate () As Boolean

戻り値

検証ルールが成功した場合は true。それ以外の場合は falsetrue if the validation rules succeed; otherwise, false.

次の例は、「解説」で説明されているシナリオを示しています。The following example demonstrates the scenario that is discussed in the Remarks section. この例では、ユーザーがライブラリ項目のデータを入力し、データを送信できるようにします。The example enables a user to enter data for a library item and submit the data. TextBoxという名前callNumののバインディングにValidationRuleは、関連付けられたがあります。The binding for the TextBox named callNum has a ValidationRule associated with it. TextBoxフォーカスを失った場合、このValidateWithoutUpdate例ではを呼び出します。When the TextBox loses focus, the example calls ValidateWithoutUpdate. ユーザーが [送信] ボタンをクリックすると、 UpdateSourceこの例ではを呼び出して変更をコミットします。When the user clicks the submit button, the example calls UpdateSource to commit the changes. 次の XAML は、アプリケーションのユーザーインターフェイスを作成します。The following XAML creates the user interface for the application.

<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="HeaderedContentControl">
            <Setter Property="Margin" Value="2"/>
            <Setter Property="Focusable" Value="False"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="HeaderedContentControl">
                        <DockPanel LastChildFill="False">
                            <ContentPresenter ContentSource="Header" DockPanel.Dock="Left" 
                              Focusable="False" VerticalAlignment="Center"/>
                            <ContentPresenter ContentSource="Content" Margin="5,0,0,0" 
                              DockPanel.Dock="Right" VerticalAlignment="Center"/>
                        </DockPanel>

                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

</StackPanel.Resources>
    <HeaderedContentControl Header="Title">
        <TextBox Width="150" Text="{Binding Path=Title, Mode=TwoWay}"/>
    </HeaderedContentControl>
    <HeaderedContentControl Header="Due Date">
        <TextBox Width="150" Text="{Binding Path=DueDate, StringFormat=d, Mode=TwoWay}">

        </TextBox>
    </HeaderedContentControl>
    
    <HeaderedContentControl Header="Call Number">
        <TextBox Name="CallNum" Width="150"
                 LostFocus="CallNum_LostFocus"
                 Validation.Error="CallNum_Error">
            <TextBox.Text>
                <Binding xmlns:src="clr-namespace:BindingExpressionBaseValidateWithoutUpdating"
                    Path="CallNumber" Mode="TwoWay"
                    NotifyOnValidationError="True"
                    UpdateSourceTrigger="Explicit">
                    <Binding.ValidationRules>
                        <src:CallNumberRule ValidationStep="ConvertedProposedValue"/>
                    </Binding.ValidationRules>
                </Binding>
            </TextBox.Text>
        </TextBox>
    </HeaderedContentControl>

    <Button Click="Button_Click">Submit</Button>
    
    <HeaderedContentControl Header="Title">
        <TextBlock Text="{Binding Path=Title, Mode=TwoWay}"/>
    </HeaderedContentControl>
    
    <HeaderedContentControl Header="Due Date">
        <TextBlock Text="{Binding Path=DueDate, StringFormat=d, Mode=TwoWay}"/>
    </HeaderedContentControl>
    
    <HeaderedContentControl Header="Call Number">
        <TextBlock Text="{Binding CallNumber}"/>
    </HeaderedContentControl>

</StackPanel>

次の例は、ユーザーインターフェイスのロジックを示しています。The following example shows the logic for the user interface.

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

namespace BindingExpressionBaseValidateWithoutUpdating
{

    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            // Create an object and set it to the window's DataContext.
            LibraryItem item = new LibraryItem("Enter the title",
                    "Enter the call number",  DateTime.Now + new TimeSpan(14, 0, 0, 0));

            this.DataContext = item;
        }

        // Check whether the call number is valid when the
        // TextBox loses foces.
        private void CallNum_LostFocus(object sender, RoutedEventArgs e)
        {
            BindingExpression be = CallNum.GetBindingExpression(TextBox.TextProperty);

            be.ValidateWithoutUpdate();
        }


        // Show the validation error when one occurs.
        private void CallNum_Error(object sender, ValidationErrorEventArgs e)
        {
            if (e.Action == ValidationErrorEventAction.Added)
            {
                MessageBox.Show(e.Error.ErrorContent.ToString());
            }

        }

        // Update the source data object when the user clicks
        // the submit button.
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            BindingExpression be = CallNum.GetBindingExpression(TextBox.TextProperty);

            be.UpdateSource();
        }
    }
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Data


Partial Public Class Window1
    Inherits Window
    Public Sub New()
        InitializeComponent()

        ' Create an object and set it to the window's DataContext.
        Dim item As New LibraryItem("Enter the title", "Enter the call number", DateTime.Now + New TimeSpan(14, 0, 0, 0))

        Me.DataContext = item
    End Sub

    ' Check whether the call number is valid when the
    ' TextBox loses foces.
    Private Sub CallNum_LostFocus(ByVal sender As Object, ByVal e As RoutedEventArgs)
        Dim be As BindingExpression = CallNum.GetBindingExpression(TextBox.TextProperty)

        be.ValidateWithoutUpdate()
    End Sub


    ' Show the validation error when one occurs.
    Private Sub CallNum_Error(ByVal sender As Object, ByVal e As ValidationErrorEventArgs)
        If e.Action = ValidationErrorEventAction.Added Then
            MessageBox.Show(e.[Error].ErrorContent.ToString())

        End If
    End Sub

    ' Update the source data object when the user clicks
    ' the submit button.
    Private Sub Button_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
        Dim be As BindingExpression = CallNum.GetBindingExpression(TextBox.TextProperty)

        be.UpdateSource()
    End Sub
End Class

次の例は、アプリケーションのデータValidationRuleオブジェクトとを示しています。The following example shows the data object and ValidationRule for the application.

using System;
using System.ComponentModel;
using System.Windows.Controls;
using System.Globalization;

namespace BindingExpressionBaseValidateWithoutUpdating
{
    // LibraryItem implements INotifyPropertyChanged so that the 
    // application is notified when a property changes.  It 
    // implements IEditableObject so that pending changes can be discarded.
    // In this example, the application does not discard changes.
    public class LibraryItem : INotifyPropertyChanged, IEditableObject
    {
        struct ItemData
        {
            internal string Title;
            internal string CallNumber;
            internal DateTime DueDate;
        }

        ItemData copyData;
        ItemData currentData;

        public LibraryItem(string title, string callNum, DateTime dueDate)
        {
            Title = title;
            CallNumber = callNum;
            DueDate = dueDate;
        }

        public string Title
        {
            get { return currentData.Title; }
            set
            {
                if (currentData.Title != value)
                {
                    currentData.Title = value;
                    NotifyPropertyChanged("Title");
                }
            }
        }

        public string CallNumber
        {
            get { return currentData.CallNumber; }
            set
            {
                if (currentData.CallNumber != value)
                {
                    currentData.CallNumber = value;
                    NotifyPropertyChanged("CallNumber");
                }
            }
        }

        public DateTime DueDate
        {
            get { return currentData.DueDate; }
            set
            {
                if (value != currentData.DueDate)
                {
                    currentData.DueDate = value;
                    NotifyPropertyChanged("DueDate");
                }
            }
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        protected void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }

        #endregion

        #region IEditableObject Members

        public virtual void BeginEdit()
        {
            copyData = currentData;
        }

        public virtual void CancelEdit()
        {
            currentData = copyData;
            NotifyPropertyChanged("");

        }

        public virtual void EndEdit()
        {
            copyData = new ItemData();

        }

        #endregion

    }

    public class CallNumberRule : ValidationRule
    {
        // A valid call number contains a period (.)
        // and 6 characters after the period.
        public override ValidationResult Validate(object value, 
                                         CultureInfo cultureInfo)
        {
            string callNum = (string)value;

            int dotIndex = callNum.IndexOf(".");
            if (dotIndex == -1 || dotIndex == 0)
            {
                return new ValidationResult(false, 
                    "There must be characters followed by a period (.) in the call number.");
            }

            string substr = callNum.Substring(dotIndex + 1);

            if (substr.Length != 6)
            {
                return new ValidationResult(false, 
                    "The call number must have 6 characters after the period (.).");

            }

            return ValidationResult.ValidResult;
        }
    }

}
Imports System.ComponentModel
Imports System.Windows.Controls
Imports System.Globalization

' LibraryItem implements INotifyPropertyChanged so that the 
' application is notified when a property changes. It 
' implements IEditableObject so that pending changes can be discarded.
' In this example, the application does not discard changes.
Public Class LibraryItem
    Implements INotifyPropertyChanged
    Implements IEditableObject
    Private Structure ItemData
        Friend Title As String
        Friend CallNumber As String
        Friend DueDate As DateTime
    End Structure

    Private copyData As ItemData
    Private currentData As ItemData

    Public Sub New(ByVal title As String, ByVal callNum As String, ByVal dueDate As DateTime)
        Me.Title = title
        Me.CallNumber = callNum
        Me.DueDate = DueDate
    End Sub

    Public Property Title() As String
        Get
            Return currentData.Title
        End Get
        Set(ByVal value As String)
            If currentData.Title <> value Then
                currentData.Title = value
                NotifyPropertyChanged("Title")
            End If
        End Set
    End Property

    Public Property CallNumber() As String
        Get
            Return currentData.CallNumber
        End Get
        Set(ByVal value As String)
            If currentData.CallNumber <> value Then
                currentData.CallNumber = value
                NotifyPropertyChanged("CallNumber")
            End If
        End Set
    End Property

    Public Property DueDate() As DateTime
        Get
            Return currentData.DueDate
        End Get
        Set(ByVal value As DateTime)
            If value <> currentData.DueDate Then
                currentData.DueDate = value
                NotifyPropertyChanged("DueDate")
            End If
        End Set
    End Property

#Region "INotifyPropertyChanged Members"

    Public Event PropertyChanged As PropertyChangedEventHandler _
        Implements INotifyPropertyChanged.PropertyChanged

    Protected Sub NotifyPropertyChanged(ByVal info As [String])
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
    End Sub

#End Region

#Region "IEditableObject Members"

    Public Overridable Sub BeginEdit() _
        Implements IEditableObject.BeginEdit

        copyData = currentData
    End Sub

    Public Overridable Sub CancelEdit() _
        Implements IEditableObject.CancelEdit

        currentData = copyData

        NotifyPropertyChanged("")
    End Sub

    Public Overridable Sub EndEdit() _
        Implements IEditableObject.EndEdit

        copyData = New ItemData()
    End Sub

#End Region

End Class

Public Class CallNumberRule
    Inherits ValidationRule

    ' A valid call number contains a period (.)
    ' and 6 characters after the period.
    Public Overloads Overrides Function Validate(ByVal value As Object,
                               ByVal cultureInfo As CultureInfo) As ValidationResult

        Dim callNum As String = DirectCast(value, String)

        Dim dotIndex As Integer = callNum.IndexOf(".")

        If dotIndex = -1 OrElse dotIndex = 0 Then
            Return New ValidationResult(False,
                "There must be characters followed by a period (.) in the call number.")
        End If

        Dim substr As String = callNum.Substring(dotIndex + 1)

        If substr.Length <> 6 Then
            Return New ValidationResult(False,
                "The call number must have 6 characters after the period (.).")
        End If

        Return ValidationResult.ValidResult
    End Function
End Class

注釈

ValidateWithoutUpdateメソッドを使用すると、バインディングのソースを更新せずに、バインディングに対して検証規則を実行できます。The ValidateWithoutUpdate method enables you to run validation rules on a binding without updating the source of the binding. これは、ユーザー入力を検証し、アプリケーション内で異なるタイミングでソースを更新する場合に便利です。This is useful when you want to validate user input and update the source at different times in an application.

たとえば、[送信] ボタンを含むデータソースを更新するためのフォームがあるとします。For example, suppose you have a form to update a data source that contains a submit button. ユーザーがフォームを送信しようとする前に無効な値が入力された場合に、ユーザーにフィードバックを提供します。You want to provide feedback to the user if an invalid value is entered before the user attempts to submit the form. フィールドの有効性を確認するにUpdateSourceTriggerは、バインドのプロパティをに設定し、がTextBoxフォーカスを失ったときにをExplicit呼び出しValidateWithoutUpdateます。You can check the validity of a field by setting the binding's UpdateSourceTrigger property to Explicit and calling ValidateWithoutUpdate when the TextBox loses focus.

適用対象