将ListView中的SelectedItem绑定到Windows Phone 8.1中的ViewModel

薛定ding的盒子

我有以下代码:

<ListView SelectionMode="Multiple" ItemsSource="{Binding MyList}" ItemTemplate="{StaticResource MyListTemplate}">
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsSelected}"/>
        </Style>
    </ListView.ItemContainerStyle>
</ListView>

使用以下DataTemplate:

<Page.Resources>
    <!-- Data Template for the ListView -->
    <DataTemplate x:Key="MyListTemplate">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="150" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <Image Grid.Column="0" Source="{Binding Path=Icon}" />
            <StackPanel Grid.Column="1" Orientation="Vertical">
                    <TextBlock Text="{Binding Path=EntryDate}" TextAlignment="Left" />
                <TextBlock Text="{Binding Path=Url}" TextAlignment="Left" />
                <TextBlock Text="{Binding Path=Text}" TextAlignment="Left" />
            </StackPanel>
        </Grid>
    </DataTemplate>
</Page.Resources>

在我的ViewModel中,我有以下内容:

private ObservableCollection<MyModel> myList;
public ObservableCollection<MyModel> MyList {
    get { return myList; }
    set {
        myList = value;
        RaisePropertyChanged("MyList");
    }
}

public IEnumerable<MyModel> SelectedItems {
    get { return MyList == null ? null : MyList.Where(e => e.IsSelected); }
}

在我的模型中,我拥有以下IsSelected财产:

private bool isSelected;
public bool IsSelected {
    get { return isSelected; }
    set { Set(ref isSelected, value); }
}

我可以看到SelectedItems元素具有所有元素MyList,但是,当我在UI中选择一些元素时,该属性IsSelected未更新,它们都保留为false。
那我在做什么错呢?

薛定ding的盒子

感谢MSDN论坛中的YossiStarz,我设法解决了我的问题。所以这是他的解决方案:

问题是您不能在放置样式的元素上使用样式来对SetBinding进行设置。这是因为样式是在创建列表视图时创建的,而不是为每个项目容器创建的。实际上,您正在创建一个样式对象,该对象具有一个setter对象,该对象的Value属性绑定到Style父对象的DataContext的IsSelected(没有巫婆)。发生此绑定是为了在设置器中设置Value属性的值。如果它将成功获取价值,那么这就是它将为所有项目容器设置的价值。
我为您提供解决方案。
首先也是最简单的,创建以下帮助程序类:

public class Helper {
    public static string GetIsSelectedContainerBinding(DependencyObject obj) {
        return (string)obj.GetValue(IsSelectedContainerBindingProperty);
    }

    public static void SetIsSelectedContainerBinding(DependencyObject obj, string value) {
        obj.SetValue(IsSelectedContainerBindingProperty, value);
    }

    // Using a DependencyProperty as the backing store for IsSelectedContainerBinding.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty IsSelectedContainerBindingProperty =
        DependencyProperty.RegisterAttached("IsSelectedContainerBinding", typeof(string), typeof(helper), new PropertyMetadata(null, IsSelectedContainerBindingPropertyChangedCallback));

    public static void IsSelectedContainerBindingPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) {
        BindingOperations.SetBinding(d, ListViewItem.IsSelectedProperty, new Binding() {
            Source = d,
            Path = new PropertyPath("Content." + e.NewValue),
            Mode = BindingMode.TwoWay
        });
    }
}

现在将设置器更改为:

<Style TargetType="ListViewItem">
    <Setter Property="local:Helper.IsSelectedContainerBinding" Value="IsSelected"/>
</Style>

这应该将SetBinding应用于创建的每个容器。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将Cookie传递到Windows Phone 8中的WebBrowser

来自分类Dev

Windows Phone 8中的NavigationDrawer

来自分类Dev

Windows Phone 8中的getrequeststream

来自分类Dev

Windows Phone 8中的NavigationDrawer

来自分类Dev

如何从Windows Phone 8中的数据绑定设置样式staticresource

来自分类Dev

如何从Windows Phone 8中的xml文件绑定数据?

来自分类Dev

Windows Phone 8中的多级数据绑定

来自分类Dev

将数据绑定到Windows Phone中的可观察集合

来自分类Dev

Windows Phone 8绑定多个选择ListView

来自分类Dev

何时以及如何在Windows Phone wp8中的ViewModel中调用异步方法

来自分类Dev

单击LongListSelector Windows Phone 8中的按钮

来自分类Dev

避免Windows Phone 8中的内存泄漏

来自分类Dev

Windows Phone 8中的消息警报

来自分类Dev

Windows Phone 8中的响应式UI

来自分类Dev

在Windows Phone 8中解析xml数据

来自分类Dev

在Windows Phone 8中共享应用

来自分类Dev

Windows Phone 8中的“相机捕获任务”

来自分类Dev

在Windows Phone 8中找不到“ Sqlite”

来自分类Dev

从Windows Phone 8中的BackgroundAudioPlayer缓存音乐

来自分类Dev

在Windows Phone 8中获取市民地址

来自分类Dev

Windows Phone 8中颜色的条件StaticResource

来自分类Dev

单击LongListSelector Windows Phone 8中的按钮

来自分类Dev

在Windows Phone 8中更新图像控件

来自分类Dev

Windows Phone 8中的圆形进度栏

来自分类Dev

在Windows Phone 8中从其他类调用时,发现ViewModel列表为空

来自分类Dev

从sqlite数据库中选择数据并将值绑定到Windows Phone 8应用中的列表框项

来自分类Dev

从sqlite数据库中选择数据并将值绑定到Windows Phone 8应用中的列表框项

来自分类Dev

Windows Phone 8图像绑定

来自分类Dev

Hot to design the ViewModel for a windows phone 8 pivot app

Related 相关文章

  1. 1

    将Cookie传递到Windows Phone 8中的WebBrowser

  2. 2

    Windows Phone 8中的NavigationDrawer

  3. 3

    Windows Phone 8中的getrequeststream

  4. 4

    Windows Phone 8中的NavigationDrawer

  5. 5

    如何从Windows Phone 8中的数据绑定设置样式staticresource

  6. 6

    如何从Windows Phone 8中的xml文件绑定数据?

  7. 7

    Windows Phone 8中的多级数据绑定

  8. 8

    将数据绑定到Windows Phone中的可观察集合

  9. 9

    Windows Phone 8绑定多个选择ListView

  10. 10

    何时以及如何在Windows Phone wp8中的ViewModel中调用异步方法

  11. 11

    单击LongListSelector Windows Phone 8中的按钮

  12. 12

    避免Windows Phone 8中的内存泄漏

  13. 13

    Windows Phone 8中的消息警报

  14. 14

    Windows Phone 8中的响应式UI

  15. 15

    在Windows Phone 8中解析xml数据

  16. 16

    在Windows Phone 8中共享应用

  17. 17

    Windows Phone 8中的“相机捕获任务”

  18. 18

    在Windows Phone 8中找不到“ Sqlite”

  19. 19

    从Windows Phone 8中的BackgroundAudioPlayer缓存音乐

  20. 20

    在Windows Phone 8中获取市民地址

  21. 21

    Windows Phone 8中颜色的条件StaticResource

  22. 22

    单击LongListSelector Windows Phone 8中的按钮

  23. 23

    在Windows Phone 8中更新图像控件

  24. 24

    Windows Phone 8中的圆形进度栏

  25. 25

    在Windows Phone 8中从其他类调用时,发现ViewModel列表为空

  26. 26

    从sqlite数据库中选择数据并将值绑定到Windows Phone 8应用中的列表框项

  27. 27

    从sqlite数据库中选择数据并将值绑定到Windows Phone 8应用中的列表框项

  28. 28

    Windows Phone 8图像绑定

  29. 29

    Hot to design the ViewModel for a windows phone 8 pivot app

热门标签

归档