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 долларов доступен не менее семи дней.

В следующем примере создается пользовательский интерфейс приложения. Корневой BindingGroup каталог StackPanel содержит объект , который проверяет ValidationRule элемент, как описано выше. Объекты привязки 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 успешного выполнения приложение начинает другую транзакцию редактирования. При сбое ValidationRuleValidation.Error происходит событие, так как для приложения задано BindingGroup значение NotifyOnValidationErrortrue в (в предыдущем примере). ItemErrorValidation.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 в своем Validate методе BindingGroup для получения значений, введенных пользователем в форму, и проверяет, что если элемент превышает 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, который имеет свойства , StreetCity, ZipCodeи Country, значениями, предоставленными пользователем. Приложение имеет панель, содержащую четыре TextBox элемента управления, каждый из которых является данными, привязанными к одному из свойств объекта. Для проверки Address объекта можно использовать ValidationRule в BindingGroup . Если привязки участвуют в одном и том же BindingGroup, можно убедиться, что почтовый индекс действителен для страны или региона адреса.

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

  • Источник привязки и DataContext элемент элемента, имеющего BindingGroup объект , являются одинаковым объектом, BindingGroupName а свойство не задано.

  • Свойство BindingGroupName привязки равно свойству NameBindingGroup объекта , и для них явно не задано значение null.

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

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

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

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

BindingGroup()

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

Свойства

BindingExpressions

Возвращает коллекцию объектов BindingExpression, которая содержит информацию для каждого объекта Binding в объекте BindingGroup.

CanRestoreValues

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

DependencyObjectType

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

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

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

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

Получает значение, указывающее, прошел ли BindingGroup правило проверки.

IsDirty

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

IsSealed

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

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

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

Name

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

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