Поделиться через


BindingGroup Класс

Определение

Содержит коллекцию привязок и ValidationRule объектов, которые используются для проверки объекта.

public ref class BindingGroup : System::Windows::DependencyObject
public class BindingGroup : System.Windows.DependencyObject
type BindingGroup = class
    inherit DependencyObject
Public Class BindingGroup
Inherits DependencyObject
Наследование

Примеры

В следующих примерах создается приложение, которое предложит пользователю ввести описание и цену элемента, а также дату истечения срока действия предложения. Приложение отображает текущие сведения для элемента под формой. Пользователь может отправить или отменить изменения.

Приложение выполняет указанные ниже действия, чтобы добиться этого.

  • BindingGroup Создает и добавляет его корень StackPanel при создании пользовательского интерфейса приложения.

  • Вызовы BeginEditи CommitEditCancelEdit в логике приложения для включения отката изменений.

  • Вызовы TryGetValue метода Validate , чтобы получить входные данные пользователя, а затем убедитесь, что элемент более 100 долларов доступен по крайней мере семь дней.

В следующем примере создается пользовательский интерфейс приложения. Корневой каталог StackPanel содержит элемент BindingGroupValidationRule , который проверяет элемент, как описано ранее. Объекты привязки свойства Price и OfferExpires свойства становятся частью BindingGroup каждой привязки ValidationRule , чтобы убедиться, что цена и дата соответственно являются допустимыми значениями. Правила проверки для отдельных свойств выполняются перед параметром ValidationRuleBindingGroup.

<StackPanel Name="stackPanel1"  Margin="10" Width="250"
            Loaded="stackPanel1_Loaded"
            Validation.Error="ItemError">

  <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>

    <Style TargetType="Button">
      <Setter Property="Width" Value="100"/>
      <Setter Property="Margin" Value="10,15,15,15"/>

    </Style>

  </StackPanel.Resources>
  
  <StackPanel.BindingGroup>
    <BindingGroup NotifyOnValidationError="True">
      <BindingGroup.ValidationRules>
        <src:ValidateDateAndPrice ValidationStep="ConvertedProposedValue" />
      </BindingGroup.ValidationRules>
    </BindingGroup>
  </StackPanel.BindingGroup>
  
  <TextBlock FontSize="14" Text="Enter an item for sale"/>
  <HeaderedContentControl Header="Description">
    <TextBox Width="150" Text="{Binding Path=Description, Mode=TwoWay}"/>
  </HeaderedContentControl>
  <HeaderedContentControl Header="Price">
    <TextBox Name="priceField"  Width="150">
      <TextBox.Text>
        <Binding Path="Price" Mode="TwoWay" >
          <Binding.ValidationRules>
            <src:PriceIsAPositiveNumber/>
          </Binding.ValidationRules>
        </Binding>
      </TextBox.Text>
    </TextBox>
  </HeaderedContentControl>
  <HeaderedContentControl Header="Date Offer Ends">
    <TextBox Name="dateField" Width="150" >
      <TextBox.Text>
        <Binding Path="OfferExpires" StringFormat="d" >
          <Binding.ValidationRules>
            <src:FutureDateRule/>
          </Binding.ValidationRules>
        </Binding>
      </TextBox.Text>
    </TextBox>
  </HeaderedContentControl>
  <StackPanel Orientation="Horizontal">
    <Button IsDefault="True" Click="Submit_Click">_Submit</Button>
    <Button IsCancel="True" Click="Cancel_Click">_Cancel</Button>
  </StackPanel>
  <HeaderedContentControl Header="Description">
    <TextBlock Width="150" Text="{Binding Path=Description}"/>
  </HeaderedContentControl>
  <HeaderedContentControl Header="Price">
    <TextBlock Width="150" Text="{Binding Path=Price, StringFormat=c}"/>
  </HeaderedContentControl>
  <HeaderedContentControl Header="Date Offer Ends">
    <TextBlock Width="150" Text="{Binding Path=OfferExpires, StringFormat=d}"/>
  </HeaderedContentControl>
</StackPanel>

В следующем примере показаны обработчики событий для приложения. Когда пользователь нажимает кнопку "Отправить", приложение вызывает CommitEdit каждое ValidationRule , связанное с ним BindingGroup. Если каждая из них ValidationRule выполнена успешно, CommitEdit сохраняет значения в объекте и завершает транзакцию редактирования. В случае CommitEdit успешного выполнения приложение начинает другую транзакцию редактирования. При сбое ValidationRule происходит событие, Validation.Error так как приложение установлено NotifyOnValidationError на true сайте BindingGroup (в предыдущем примере). ItemError Validation.Error обрабатывает событие и отображает сведения об ошибке проверки пользователю. В примере также обрабатывается Loaded событие для StackPanel события и Click события для кнопки "Отмена ".


private void Submit_Click(object sender, RoutedEventArgs e)
{
    if (stackPanel1.BindingGroup.CommitEdit())
    {
        MessageBox.Show("Item submitted");
        stackPanel1.BindingGroup.BeginEdit();
    }
}

// This event occurs when a ValidationRule in the BindingGroup
// or in a Binding fails.
private void ItemError(object sender, ValidationErrorEventArgs e)
{
    if (e.Action == ValidationErrorEventAction.Added)
    {
        MessageBox.Show(e.Error.ErrorContent.ToString());
    }
}

void stackPanel1_Loaded(object sender, RoutedEventArgs e)
{
    // Set the DataContext to a PurchaseItem object.
    // The BindingGroup and Binding objects use this as
    // the source.
    stackPanel1.DataContext = new PurchaseItem();

    // Begin an edit transaction that enables
    // the object to accept or roll back changes.
    stackPanel1.BindingGroup.BeginEdit();
}

private void Cancel_Click(object sender, RoutedEventArgs e)
{
    // Cancel the pending changes and begin a new edit transaction.
    stackPanel1.BindingGroup.CancelEdit();
    stackPanel1.BindingGroup.BeginEdit();
}

Private Sub Submit_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
    If stackPanel1.BindingGroup.CommitEdit() Then
        MessageBox.Show("Item submitted")
        stackPanel1.BindingGroup.BeginEdit()
    End If


End Sub

' This event occurs when a ValidationRule in the BindingGroup
' or in a Binding fails.
Private Sub ItemError(ByVal sender As Object, ByVal e As ValidationErrorEventArgs)
    If e.Action = ValidationErrorEventAction.Added Then
        MessageBox.Show(e.Error.ErrorContent.ToString())

    End If
End Sub

Private Sub stackPanel1_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs)
    ' Set the DataContext to a PurchaseItem object.
    ' The BindingGroup and Binding objects use this as
    ' the source.
    stackPanel1.DataContext = New PurchaseItem()

    ' Begin an edit transaction that enables
    ' the object to accept or roll back changes.
    stackPanel1.BindingGroup.BeginEdit()
End Sub

Private Sub Cancel_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
    ' Cancel the pending changes and begin a new edit transaction.
    stackPanel1.BindingGroup.CancelEdit()
    stackPanel1.BindingGroup.BeginEdit()
End Sub

В следующем примере показан пользовательский ValidationRuleValidateDateAndPriceобъект, добавленный в BindingGroup первый пример. Метод ValidationRule использует BindingGroup метод Validate для получения значений, введенных пользователем в форму, и проверяет, что если элемент превышает 100 долларов, он будет доступен по крайней мере семь дней.

public class ValidateDateAndPrice : ValidationRule
{
    // Ensure that an item over $100 is available for at least 7 days.
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        BindingGroup bg = value as BindingGroup;

        // Get the source object.
        PurchaseItem item = bg.Items[0] as PurchaseItem;
        
        object doubleValue;
        object dateTimeValue;

        // Get the proposed values for Price and OfferExpires.
        bool priceResult = bg.TryGetValue(item, "Price", out doubleValue);
        bool dateResult = bg.TryGetValue(item, "OfferExpires", out dateTimeValue);

        if (!priceResult || !dateResult)
        {
            return new ValidationResult(false, "Properties not found");
        }

        double price = (double)doubleValue;
        DateTime offerExpires = (DateTime)dateTimeValue;

        // Check that an item over $100 is available for at least 7 days.
        if (price > 100)
        {
            if (offerExpires < DateTime.Today + new TimeSpan(7, 0, 0, 0))
            {
                return new ValidationResult(false, "Items over $100 must be available for at least 7 days.");
            }
        }

        return ValidationResult.ValidResult;
    }
}
Public Class ValidateDateAndPrice
    Inherits ValidationRule
    ' Ensure that an item over $100 is available for at least 7 days.
    Public Overrides Function Validate(ByVal value As Object, ByVal cultureInfo As CultureInfo) As ValidationResult
        Dim bg As BindingGroup = TryCast(value, BindingGroup)

        ' Get the source object.
        Dim item As PurchaseItem = TryCast(bg.Items(0), PurchaseItem)

        Dim doubleValue As Object = Nothing
        Dim dateTimeValue As Object = Nothing

        ' Get the proposed values for Price and OfferExpires.
        Dim priceResult As Boolean = bg.TryGetValue(item, "Price", doubleValue)
        Dim dateResult As Boolean = bg.TryGetValue(item, "OfferExpires", dateTimeValue)

        If (Not priceResult) OrElse (Not dateResult) Then
            Return New ValidationResult(False, "Properties not found")
        End If

        Dim price As Double = CDbl(doubleValue)
        Dim offerExpires As Date = CDate(dateTimeValue)

        ' Check that an item over $100 is available for at least 7 days.
        If price > 100 Then
            If offerExpires < Date.Today + New TimeSpan(7, 0, 0, 0) Then
                Return New ValidationResult(False, "Items over $100 must be available for at least 7 days.")
            End If
        End If

        Return ValidationResult.ValidResult

    End Function
End Class

Комментарии

Создается BindingGroup связь между несколькими привязками, которые можно проверить и обновить вместе. Например, предположим, что приложение предложит пользователю ввести адрес. Затем приложение заполняет объект типаAddress, который имеет свойства, Street, CityZipCodeи , а также Countryзначения, предоставленные пользователем. У приложения есть панель, содержащая четыре TextBox элемента управления, каждая из которых привязана к одному из свойств объекта. Для проверки объекта можно использовать в ValidationRule объекте BindingGroupAddress . Если привязки участвуют в одном и том же BindingGroup, вы можете убедиться, что почтовый индекс действителен для страны или региона адреса.

Вы задаете BindingGroup свойство включено FrameworkElement или FrameworkContentElement. Дочерние BindingGroup элементы наследуются от родительских элементов так же, как и с любым другим наследуемым свойством. Привязка к элементу потомка добавляется BindingGroup в одну из следующих ситуаций:

В примере адреса предположим, что DataContextPanel для объекта типа Addressзадано значение. Привязка для каждой из них TextBox добавляется на BindingGroup панель.

Объекты добавляются ValidationRule в BindingGroupобъект . Передается BindingGroup в качестве первого параметра Validate метода при выполнении ValidationRule . Для получения предлагаемых значений объекта можно использовать TryGetValue метод или GetValue(Object, String) метод BindingGroup , а Items также свойство для получения источников привязок.

Источник BindingGroup привязки обновляется одновременно вместо каждой привязки, обновляемой отдельно. При вызове одного из методов для проверки данных (ValidateWithoutUpdateилиUpdateSourcesCommitEdit) привязка для каждого TextBox из примеров проверяется и потенциально обновляется. Если привязка является частью BindingGroup, источник привязки не обновляется, пока не вызовете UpdateSources или CommitEditBindingGroupне назначите свойство явным UpdateSourceTrigger образом.

Конструкторы

Имя Описание
BindingGroup()

Инициализирует новый экземпляр класса BindingGroup.

Свойства

Имя Описание
BindingExpressions

Возвращает коллекцию BindingExpression объектов, содержащих сведения для каждой привязки в объекте BindingGroup.

CanRestoreValues

Возвращает, может ли каждый источник в привязке отменить ожидающие изменения и восстановить исходные значения.

DependencyObjectType

Возвращает объект DependencyObjectType , который упаковывает тип СРЕДЫ CLR этого экземпляра.

(Унаследовано от DependencyObject)
Dispatcher

Dispatcher Возвращает это DispatcherObject значение, с которым связано.

(Унаследовано от DispatcherObject)
HasValidationError

Возвращает значение, указывающее, имеет ли BindingGroup правило проверки сбоем.

IsDirty

Возвращает или задает значение, указывающее, содержит ли BindingGroup предлагаемое значение, которое не было записано в источник.

IsSealed

Возвращает значение, указывающее, запечатан ли этот экземпляр (только для чтения).

(Унаследовано от DependencyObject)
Items

Возвращает источники, используемые объектами Привязки в объекте BindingGroup.

Name

Возвращает или задает имя, определяющее BindingGroupобъект , который можно использовать для включения и исключения объектов Привязки в объекте BindingGroup.

NotifyOnValidationError

Возвращает или задает, возникает ли Error событие при изменении состояния ValidationRule .

Owner

Возвращает объект, которому назначен этот BindingGroup объект.

SharesProposedValues

Возвращает или задает значение, указывающее, используется ли BindingGroup повторное использование целевых значений, которые не были зафиксированы в источнике.

ValidatesOnNotifyDataError

Возвращает или задает значение, указывающее, следует ли включать .NotifyDataErrorValidationRule

ValidationErrors

Возвращает коллекцию ValidationError объектов, которые привели BindingGroup к недопустимой.

ValidationRules

Возвращает коллекцию ValidationRule объектов, проверяющих исходные объекты в объекте BindingGroup.

Методы

Имя Описание
BeginEdit()

Начинает транзакцию редактирования в источниках в .BindingGroup

CancelEdit()

Завершает транзакцию редактирования и отменяет ожидающие изменения.

CheckAccess()

Определяет, имеет ли вызывающий поток доступ к этому DispatcherObject.

(Унаследовано от DispatcherObject)
ClearValue(DependencyProperty)

Очищает локальное значение свойства. Свойство для очистки указывается идентификатором DependencyProperty .

(Унаследовано от DependencyObject)
ClearValue(DependencyPropertyKey)

Очищает локальное значение свойства только для чтения. Свойство, которое необходимо очистить, задается параметром DependencyPropertyKey.

(Унаследовано от DependencyObject)
CoerceValue(DependencyProperty)

Принуждает значение указанного свойства зависимостей. Это достигается путем вызова любой CoerceValueCallback функции, указанной в метаданных свойств для свойства зависимостей, так как он существует при вызове DependencyObject.

(Унаследовано от DependencyObject)
CommitEdit()

Выполняет все объекты и обновляет источники привязки ValidationRule , если все правила проверки выполнены успешно.

Equals(Object)

Определяет, эквивалентен ли предоставленный DependencyObject объект текущему DependencyObject.

(Унаследовано от DependencyObject)
GetHashCode()

Получает хэш-код для этого DependencyObject.

(Унаследовано от DependencyObject)
GetLocalValueEnumerator()

Создает специализированный перечислитель для определения того, какие свойства зависимостей имеют локальные значения для этого DependencyObject.

(Унаследовано от DependencyObject)
GetType()

Возвращает Type текущего экземпляра.

(Унаследовано от Object)
GetValue(DependencyProperty)

Возвращает текущее эффективное значение свойства зависимостей для этого экземпляра DependencyObject.

(Унаследовано от DependencyObject)
GetValue(Object, String)

Возвращает предлагаемое значение для указанного свойства и элемента.

InvalidateProperty(DependencyProperty)

Повторно вычисляет эффективное значение для указанного свойства зависимостей.

(Унаследовано от DependencyObject)
MemberwiseClone()

Создает неглубокую копию текущей Object.

(Унаследовано от Object)
OnPropertyChanged(DependencyPropertyChangedEventArgs)

Вызывается при каждом обновлении эффективного значения любого свойства DependencyObject зависимостей. Определенное свойство зависимостей, которое изменилось, сообщается в данных события.

(Унаследовано от DependencyObject)
ReadLocalValue(DependencyProperty)

Возвращает локальное значение свойства зависимостей, если оно существует.

(Унаследовано от DependencyObject)
SetCurrentValue(DependencyProperty, Object)

Задает значение свойства зависимостей, не изменяя его источник значений.

(Унаследовано от DependencyObject)
SetValue(DependencyProperty, Object)

Задает локальное значение свойства зависимостей, указанное его идентификатором свойства зависимостей.

(Унаследовано от DependencyObject)
SetValue(DependencyPropertyKey, Object)

Задает локальное значение свойства зависимостей только для чтения, указанное DependencyPropertyKey идентификатором свойства зависимости.

(Унаследовано от DependencyObject)
ShouldSerializeProperty(DependencyProperty)

Возвращает значение, указывающее, должны ли процессы сериализации сериализовать значение для указанного свойства зависимостей.

(Унаследовано от DependencyObject)
ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)
TryGetValue(Object, String, Object)

Пытается получить предлагаемое значение для указанного свойства и элемента.

UpdateSources()

Запускает преобразователь для привязки и ValidationRule объектов, для которых ValidationStep задано RawProposedValueсвойство , ConvertedProposedValueили UpdatedValue сохраняет значения целевых объектов в исходных объектах, если все правила проверки выполнены успешно.

ValidateWithoutUpdate()

Запускает преобразователь для привязки и ValidationRule объектов, для которых ValidationStep задано RawProposedValue свойство или ConvertedProposedValue.

VerifyAccess()

Принудительно применяет, что вызывающий поток имеет доступ к этому DispatcherObject.

(Унаследовано от DispatcherObject)

Применяется к