MultiBinding silverlight 4 (баг №2)
Продолжая серию статей Silverlight 4 step by step
Описание проблемы:
Решение проблемы с мультибайдингом я честно нашел в интернете, но справился с ней не сразу. В данной статье я расскажу что вам понадобиться и приведу пример конвертора Concat.
Решение проблемы отсутствия multibinding:
Первое, что вам нужно, это посетить блог scottlogic silverlight multibinding solution for silverlight-4/ – там подробно описано, что и как работает. Я же вам расскажу что конкретно вам нужно.
Второе, если вам не интересно читать английский блог, то просто скачайте SLMultiBindingUpdate.zip – этот проект у меня не запустился, но всё равно нам нужно от туда только 3 файла.
- BindingUtil.cs
- IMultiValueConverter.cs
- MultiBinding.cs
Кидаем их в своей проект. Теперь нам нужно только осуществить байдинг, я вам покажу два способа:
XAML:
<TextBlock>
<SLMultiBinding:BindingUtil.MultiBinding>
<SLMultiBinding:MultiBinding TargetProperty="Text"
Converter="{StaticResource ConverterConcat}">
<Binding Path="x"/>
<Binding Path="y"/>
</SLMultiBinding:MultiBinding>
</SLMultiBinding:BindingUtil.MultiBinding>
</TextBlock>
C# codebehind:
var textBlock = new TextBlock();
var binding = new MultiBinding()
{
TargetProperty = "Text",
Converter = new Helpers.Converter.ConcatConverter(),
Bindings = new ObservableCollection<Binding>()
{
new Binding("x"),
new Binding("y")
},
ConverterParameter = "{0}/{1}"
};
SLMultiBinding.BindingUtil.SetMultiBinding(textBlock, binding);
stack.Children.Add(textBlock);
Подождите не компилируйте, вам ещё нужен мой конвертор ConcatConverter, который просто делает конкатенацию строк.
ConcatConverter:
public class ConcatConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType,
object parameter, System.Globalization.CultureInfo culture)
{
var strFormat = (String)parameter;
if (strFormat == null)
{
var builder = new StringBuilder();
foreach (var value in values)
{
if (value != null)
builder.Append(value.ToString());
;
}
return builder.ToString();
}
else
{
for (int i = 0; i < values.Length; i++)
{
var value = values[i];
if (value != null)
strFormat = strFormat.Replace("{" + i + "}", value.ToString());
}
return strFormat;
}
}
public object[] ConvertBack(object value, Type[] targetTypes,
object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
Конвертор работает, с ConverterParameter(“{0}/{1}”) и без ConverterParameter.
Вот и всё, теперь мы можем работать с мультибайдингом.