Главная » Разработка для Windows Phone 7 » Передача и прием Windows Phone 7

0

Два сервиса привязки, которые мы обсудили до сих пор, просто предоставляют некоторые данные. В XAML можно также создавать привязки, передающие данные в сервис привязки и возвращающие некоторый результат. В качестве очень простой демонстрации рассмотрим сервис привязки, осуществляющий такую важную операцию, как сложение двух чисел. Я назвал его Adder (Сумматор).

Проект Silverlight: Petzold.Phone.Silverlight Файл: Adder.cs

using System.ComponentModel;

namespace Petzold.Phone.Silverlight {

public class Adder : INotifyPropertyChanged {

public event PropertyChangedEventHandler PropertyChanged;

double augend = 0; double addend = 0; double sum = 0;

public double Augend {

set {

if (augend != value) {

augend = value;

0nPropertyChanged(new PropertyChangedEventArgs("Augend")); CalculateNewSum();

}

get {

return augend;

}

}

public double Addend {

set {

if (addend != value) {

addend = value;

OnPropertyChanged(new PropertyChangedEventArgs("Addend")); CalculateNewSum();

}

}

get {

return addend;

}

}

public double Sum {

protected set {

if (sum != value) {

sum = value;

OnPropertyChanged(new PropertyChangedEventArgs("Sum"));

}

}

get {

return sum;

}

}

void CalculateNewSum() {

Sum = Augend + Addend;

}

protected virtual void OnPropertyChanged(PropertyChangedEventArgs args) {

if (PropertyChanged != null)

PropertyChanged(this, args);

}

}

}

Участники операции сложения – это первое слагаемое (Augend) и второе слагаемое (Addend). Так и назовем наши свойства. Оба свойства типа double и оба совершенно открытые. Когда любому из них задается новое значение, оно формирует событие PropertyChanged и также вызывает метод CalculateNewSum (Вычислить новую сумму).

Метод CalculateNewSum выполняет сложение значений свойств Augend и Addend и полученный результат задает как значение свойства Sum (Сумма). Свойство Sum несколько отличается от двух других, потому что его метод set является защищенным, так что Sum не может быть задан извне этого класса. Но так оно и должно быть.

Проект SliderSum (Сумма значений ползунков) демонстрирует один из вариантов использования этого сервиса привязки в приложении. Коллекция Resources ссылается на два файла из библиотеки Petzold.Phone.Silverlight:

Проект Silverlight: SliderSum Файл: MainPage.xaml (фрагмент)

<phone:PhoneApplicationPage.Resources> <petzold:Adder x:Key="adder" />

<petzold:StringFormatConverter x:Key="stringFormat" /> </phone:PhoneApplicationPage.Resources>

В области содержимого располагаются два элемента Slider, сверху и снизу, и довольно большую площадь занимает TextBlock:

Проект Silverlight: SliderSum Файл: MainPage.xaml (фрагмент)

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0" DataContext="{Binding Source={StaticResource adder}}"> <Grid.RowDefinitions>

<RowDefinition Height="Auto" /> <RowDefinition Height="*" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions>

<Slider Grid.Row="0"

Minimum="-10 0" Maximum="10 0" Margin="24"

Value="{Binding Augend, Mode=TwoWay}" />

<Slider Grid.Row="2"

Minimum="-10 0" Maximum="10 0" Margin="24"

Value="{Binding Addend, Mode=TwoWay}" />

<TextBlock Grid.Row="1"

HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="4 8" Text="{Binding Sum,

Converter={StaticResource stringFormat}, ConverterParameter=’ {0:F2} ‘}" />

</Grid>

Обратите внимание на DataContext в Grid. Элементы управления Slider поставляют значения свойствам Augend и Addend, но эти свойства не могут быть целями привязки, потому что они не продублированы свойствами-зависимостями. Adder должен быть источником привязки, и элементы управления Slider должны быть целями привязки. Поэтому для обеих привязок задан двунаправленный режим. Изначально привязкам Slider заданы срединные значения диапазонов значений, заданных по умолчанию в классе Adder, но затем уже значения Slider передаются в свойства Augend и Addend. Привязка между TextBlock и свойством Sum обеспечивает также некоторое форматирование строки.

Предположим, требуется, чтобы отрицательные значения отображались красным. (Возможно, приложение используется для бухгалтеров.) Мы уже знаем, что для этого необходимо привлечь конвертер привязки. Обобщим его, включив сравнение передаваемого в конвертер значения с определенным критерием. Каждый из трех возможных вариантов (больше, равно или меньше) обеспечивает возвращение конвертером определенной кисти. Как и в конвертере проекта BinaryClock, эти данные могут предоставляться посредством открытых свойств класса конвертера, как здесь:

Проект Silverlight: Petzold.Phone.Silverlight Файл: ValueToBrushConverter.cs

using System;

using System.Globalization;

using System.Windows.Data;

using System.Windows.Media;

namespace Petzold.Phone.Silverlight {

public class ValueToBrushConverter : IValueConverter {

public double Criterion { set; get; } public Brush GreaterThanBrush { get; set; } public Brush EqualToBrush { get; set; } public Brush LessThanBrush { get; set; }

public object Convert(object value, Type targetType,

object parameter, CultureInfo culture)

{

double doubleVal = (value as IConvertible).ToDouble(culture);

return doubleVal >= Criterion ? doubleVal == Criterion ? EqualToBrush :

GreaterThanBrush :

LessThanBrush;

}

public object ConvertBack(object value, Type targetType,

object parameter, CultureInfo culture)

{

return null;

Изначально этот конвертер просто приводил аргумент value к типу double. Потом я решил использовать его с другими числовыми типами данных, поэтому пришел к более универсальному преобразованию с помощью метода Convertible (Поддающийся преобразованию).

В проекте SliderSumWithColor этот конвертер добавляется в неуклонно увеличивающуюся коллекцию Resources:

Проект Silverlight: SliderSumWithColor Файл: MainPage.xaml (фрагмент)

<phone:PhoneApplicationPage.Resources> <petzold:Adder x:Key="adder" />

<petzold:StringFormatConverter x:Key="stringFormat" /> <petzold:ValueToBrushConverter x:Key="valueToBrush" Criterion="0" LessThanBrush="Red"

EqualToBrush="{StaticResource PhoneForegroundBrush}" GreaterThanBrush="{StaticResource PhoneForegroundBrush}" /> </phone:PhoneApplicationPage.Resources>

Значения свойств класса ValueToBrushConverter показывают, что значения меньше нуля будут отображаться красным, все остальные значения отображаются цветом PhoneForegroundBrush (Кисть фона телефона).

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

Проект Silverlight: SliderSumWithColor Файл: MainPage.xaml (фрагмент)

<Grid … >

<TextBlock Grid.Row="1"

HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="4 8" Text="{Binding Sum,

Converter={StaticResource stringFormat}, ConverterParameter=’ {0:F2} ‘}"

Foreground="{Binding Sum,

Converter={StaticResource valueToBrush}}" />

</Grid>

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

Источник: Чарльз Петзольд, Программируем Windows Phone 7, Microsoft Press, © 2011.

По теме:

  • Комментарии