суббота, 2 октября 2010 г.

Простые правила необходимые при использовании: binding, xaml, .Net 4.0

Пост для тех, кто скорее чуствует себя новичком в xaml, binding, .Net 4.0


Правила, которые нужно помнить чтобы WTF - понять почему binding в xaml не работает 

1. Переменные нельзя использовать в binding/xaml, только свойства, поэтому
когда мы пишем

Text="{Binding MyVar, Mode=TwoWay}"


вместо того чтобы использовать в декларации класса

Public MyVar as integer

используйте

Public Property MyVar as integer

ХОТЯ

2. Кроме того вам скорее всего понадобиться "выкидывать" извещения о изменениях в бизнес объекте для обновления UI, поэтому используйте OnPropertyChanged (link) и описывайте оба: Get и Set части свойства вместо короткой записи которую мы видели выше.

3. Не забывайте, что бы обновить UI при использовании таких простых и удобных классов как lists, dictionaries вам понадобиться сделать rebind (определить заново DataSource, ItemSource) ... либо используйте observablecollection etc (link)


Чуть более сложные варианты
1. Не забывайте о возможности применения конвертеров, например чтобы на экране отобразить булеву переменную в виду разных изображений совсем не обязательно иметь эти изображения в бизнес объекте. Вместо этого можно использовать что то наподобии:

<controls:ChildWindow.Resources >
        <loc:RO_FavImageTypeConverter  x:Key="FavConverter" />
    </controls:ChildWindow.Resources>
...


<Image Source="{Binding Favorite, Converter={StaticResource FavConverter}}"/>
...

Public Class RO_FavImageTypeConverter
  Implements IValueConverter
 
  Public Function Convert(ByVal value As ObjectByVal targetType As TypeByVal parameter As ObjectByVal culture As Globalization.CultureInfoAs Object _
  Implements System.Windows.Data.IValueConverter.Convert
 
    If value Is Nothing Then Return Nothing
    Dim bIsFav = DirectCast(value, Boolean)
    If bIsFav Then
      Return Utility.ImageHelper.GetImageSource("Resources/favor_yellow.png")
    Else
      Return Utility.ImageHelper.GetImageSource("Resources/favor_grey.png")
    End If
 
  End Function

PS: Прописование конвертера в xaml можно легко найти в сети.

2. Обратите внимание, что вы можете использовать параметры конвертера. Например:


Text="{Binding Amount, Mode=TwoWay, Converter={StaticResource nmbFormat}, ConverterParameter='n0'}"

НО! обратите внимания, что такие варианты достаточно статичны. Поскольку нельзя использовать в binding более одного свойства.

Рассмотрим к примеру вариант, когда мы имеем класс с двумя свойствами - Значение и Формат. Мы можем использовать binding для Значения, но не можем так же передать Формат в функцию конвертации. Мы конечно можем исхитриться и передать в конвертер весь представитель класса но в таком случае у нас возникнет проблема с обратной связью (TwoWay binding) поскольку в обратный конвертер мы получил значения поля (изUI control), которое должно быть занесено в поле преставителя класса, но binding то был сделан на всего представителя (instance), а  не только одно поле, а значит автоматика не сработает.

Комментариев нет: