从WinRt Xaml Toolkit使用ListBoxItemExtensions.IsSelected不起作用TwoWay Binding

时间:2013-06-19 08:02:08

标签: c# xaml windows-runtime winrt-xaml winrt-xaml-toolkit

在带有WinRt Xaml Toolkit的Windows RT App(c#)中,我使用:

<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>

对于Text TwoWay Binding工作得很好,但对于扩展:ListBoxItemExtensions.IsSelected - 不起作用(仅从源到视图工作)。
有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我问过它已经在WinRT XAML Toolkit discussion并且author of that toolkit Filip Skakun回答了:

  

没错。这似乎是这个属性的限制。我们需要创建一个不同的支持双向绑定。使用我在此描述的模式的“IsSelectedBinding”属性:http://blog.onedevjob.com/2011/10/26/workaround-for-binding-not-supported-on-stylesettervalue-in-silverlight/   也许当我有机会将其添加到工具包中时。

我使用Clemens answer解决了我的问题。

看起来像:

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);
        }
    }
}