Практическое руководство. Создание привязки к методу

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

Пример

В этом примере TemperatureScale — это класс, у которого есть метод ConvertTemp, принимающий два параметра (один из double и один из enum типа TempType)) и преобразующий данное значение из одной температурной шкалы в другую. В следующем примере ObjectDataProvider используется для создания экземпляра объекта TemperatureScale. Метод ConvertTemp вызывается с двумя заданными параметрами.

<Window.Resources>
  <ObjectDataProvider ObjectType="{x:Type local:TemperatureScale}"
                      MethodName="ConvertTemp" x:Key="convertTemp">
    <ObjectDataProvider.MethodParameters>
      <system:Double>0</system:Double>
      <local:TempType>Celsius</local:TempType>
    </ObjectDataProvider.MethodParameters>
  </ObjectDataProvider>

  <local:DoubleToString x:Key="doubleToString" />

</Window.Resources>

Теперь, когда метод доступен как ресурс, вы можете привязывать к его результатам. В следующем примере выполняется привязка свойства Text объекта TextBox и значения SelectedValue поля ComboBox к двум параметрам метода. Таким образом, пользователи могут указывать исходную и целевую температурную шкалу. Обратите внимание, что для BindsDirectlyToSource устанавливается значение true, так как выполняется привязка к свойству MethodParameters экземпляра ObjectDataProvider, а не к свойствам объекта, обернутого объектом типа ObjectDataProvider (объект TemperatureScale).

Содержимое Contentпоследней метки Label обновляется, когда пользователь изменяет содержимое поля TextBox или выбор в поле со списком ComboBox.

<Label Grid.Row="1" HorizontalAlignment="Right">Enter the degree to convert:</Label>
<TextBox Grid.Row="1" Grid.Column="1" Name="tb">
  <TextBox.Text>
    <Binding Source="{StaticResource convertTemp}" Path="MethodParameters[0]"
             BindsDirectlyToSource="true" UpdateSourceTrigger="PropertyChanged"
             Converter="{StaticResource doubleToString}">
      <Binding.ValidationRules>
        <local:InvalidCharacterRule/>
      </Binding.ValidationRules>
    </Binding>
  </TextBox.Text>
</TextBox>
<ComboBox Grid.Row="1" Grid.Column="2" 
  SelectedValue="{Binding Source={StaticResource convertTemp},
  Path=MethodParameters[1], BindsDirectlyToSource=true}">
  <local:TempType>Celsius</local:TempType>
  <local:TempType>Fahrenheit</local:TempType>
</ComboBox>
<Label Grid.Row="2" HorizontalAlignment="Right">Result:</Label>
<Label Content="{Binding Source={StaticResource convertTemp}}"
    Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="2"/>

ПреобразовательDoubleToString получает число типа double и преобразует его в строку в направлении Convert (из источника привязки в цель привязки, которым является свойство Text) или преобразует строку string в число типа double в направлении ConvertBack.

Правило InvalidationCharacterRule — это правило ValidationRule, проверяющее недопустимые символы. Если входное значение не является числом типа double, для уведомления пользователей появляется шаблон ошибки по умолчанию, представляющий собой красную границу, вокруг TextBox.

См. также