Правила, которые нужно помнить чтобы 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_FavImageTypeConverterImplements IValueConverter Public Function Convert(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As Globalization.CultureInfo) As 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), а не только одно поле, а значит автоматика не сработает.
Комментариев нет:
Отправить комментарий