Использование ListBoxItemExtensions.IsSelected из WinRt Xaml Toolkit не работает Двухстороннее связывание
В Windows RT App (C#) с WinRt Xaml Toolkit я использую это:
<ListBox ItemsSource="{Binding Path=FilterBaseFields}" SelectionMode="Multiple">
<ListBox.ItemTemplate >
<DataTemplate >
<TextBox Text="{Binding Path=Key, Mode=TwoWay}"
extensions:ListBoxItemExtensions.IsSelected="{Binding Path=IsSelected, Mode=TwoWay}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Для текста TwoWay Binding отлично работает, но для расширений:ListBoxItemExtensions.IsSelected - не работает (работает только из источника для просмотра).
Есть идеи?
1 ответ
Я спросил, что это уже обсуждается в WinRT XAML Toolkit, и автор этого набора Филипп Скакун ответил:
Вот так. Кажется, это ограничение этого свойства. Нам нужно создать другой для поддержки двухстороннего связывания. Что-то вроде свойства "IsSelectedBinding", используя шаблон, который я описал здесь: http://blog.onedevjob.com/2011/10/26/workaround-for-binding-not-supported-on-stylesettervalue-in-silverlight/ Может быть, когда Я получу шанс, что добавлю это в инструментарий.
И я решаю свою проблему с помощью ответа Clemens.
Это выглядит как:
public class MyListBox : ListBox
{
protected override void PrepareContainerForItemOverride(
DependencyObject element, object item)
{
base.PrepareContainerForItemOverride(element, item);
if (item is Item)
{
var binding = new Binding
{
Source = item,
Path = new PropertyPath("IsSelected"),
Mode = BindingMode.TwoWay
};
((ListBoxItem)element).SetBinding(ListBoxItem.IsSelectedProperty, binding);
}
}
}