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


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, CommitEditи CancelEdit в логике приложения, чтобы включить откат изменений.

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

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

<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, так как приложение NotifyOnValidationErrortrueBindingGroup (в предыдущем примере). ItemError обрабатывает событие Validation.Error и отображает сведения об ошибке проверки пользователю. В примере также обрабатывается событие для и события для кнопки "Отмена ".


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, City, ZipCodeи Country, со значениями, предоставленными пользователем. Приложение содержит панель, содержащую четыре элемента управления TextBox, каждая из которых является данными, привязанными к одному из свойств объекта. Для проверки объекта Address можно использовать ValidationRule в BindingGroup. Если привязки участвуют в том же BindingGroup, вы можете убедиться, что zip-код действителен для страны или региона адреса.

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

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

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

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

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

BindingGroup()

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

Свойства

BindingExpressions

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

CanRestoreValues

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

DependencyObjectType

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

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

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

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

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

IsDirty

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

IsSealed

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

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

Возвращает источники, используемые объектами Binding в 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)

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