WPF привязка текстового поля к элементу коллекции строк
У меня есть StringCollection в моих настройках и я хочу привязать 1 из элементов к метке.
Вот как это работает.
xmlns:p="clr-namespace:MyNamespace.Properties"
<Label Content="{Binding Path=MyStringCollection.[2], Source={x:Static p:Settings.Default}}" />
Но я хочу привязать индекс к другому значению и подумал, что это должно работать. Но это не так.
<Label Content="{Binding Path=MyStringCollection.[{Binding SelectedIndex Source={x:Static p:Settings.Default}}], Source={x:Static p:Settings.Default}}" />
Кто-нибудь может мне помочь?
1 ответ
Решение
Со стоковым WPF вам нужно будет использовать IMultiValueConverter
:
public class IndexedValueConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType,
object parameter, CultureInfo culture)
{
if (values.Length < 2) return null;
var index = Convert.ToInt32(values[1], culture);
var array = values[0] as Array;
if (array != null) return array.GetValue(index);
var list = values[0] as IList;
if (list != null) return list[index];
var enumerable = values[0] as IEnumerable;
if (enumerable != null)
{
int ii = 0;
foreach (var item in enumerable)
{
if (ii++ == index) return item;
}
}
return null;
}
// ... Implement ConvertBack as desired
Тогда в вашем XAML:
<Label>
<Label.Resources>
<local:IndexedValueConverter x:Key="Indexer" />
</Label.Resources>
<Label.Content>
<MultiBinding Converter="{StaticResource Indexer}">
<Binding Path="MyStringCollection"
Source="{x:Static p:Settings.Default}" />
<Binding Path="SelectedIndex"
Source="{x:Static p:Settings.Default}" />
</MultiBinding>
</Label.Content>
</Label>