将 ListView 中的 SelectedItems 绑定到 Windows Phone 8.1 中的 ViewModel [英] Binding SelectedItems in ListView to a ViewModel in Windows Phone 8.1

查看:45
本文介绍了将 ListView 中的 SelectedItems 绑定到 Windows Phone 8.1 中的 ViewModel的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下代码:

<ListView.ItemContainerStyle><Style TargetType="ListViewItem"><Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsSelected}"/></风格></ListView.ItemContainerStyle></ListView>

使用以下数据模板:

<!-- ListView 的数据模板--><DataTemplate x:Key="MyListTemplate"><网格><Grid.ColumnDefinitions><ColumnDefinition Width="150"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions><Image Grid.Column="0" Source="{Binding Path=Icon}"/><StackPanel Grid.Column="1" Orientation="垂直"><TextBlock Text="{Binding Path=EntryDate}" TextAlignment="Left"/><TextBlock Text="{Binding Path=Url}" TextAlignment="Left"/><TextBlock Text="{Binding Path=Text}" TextAlignment="Left"/></StackPanel></网格></数据模板></Page.Resources>

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

私有 ObservableCollection我的列表;公共 ObservableCollection我的列表 {得到 { 返回 myList;}放 {myList = 值;RaisePropertyChanged("MyList");}}公共 IEnumerable选定项目{得到 { 返回 MyList == null ?null : MyList.Where(e => e.IsSelected);}}

在我的模型中,我有我的 IsSelected 属性:

private bool isSelected;public bool IsSelected {得到 { 返回被选中;}设置{设置(参考被选中,值);}}

我可以看到 SelectedItems 具有 MyList 具有的所有元素,但是,当我在 UI 中选择一些元素时,属性 IsSelected未更新,它们都是假的.
那么我在这里做错了什么?

解决方案

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

<块引用>

问题是你不能在元素上使用 Style 来 SetBinding你把风格穿上.这是因为样式创建一次当创建列表视图而不是为每个项目容器创建时.你实际上所做的是创建一个具有 setter 的样式对象对象,它的 Value 属性被绑定到 IsSelected 的样式父级的数据上下文(它没有).这种绑定发生在 setter 中设置 Value 属性的值.如果它会成功获得价值,这是它会设置的价值所有物品容器.
我有一个解决方案.
首先最简单的,创建这个辅助类:

public class Helper {公共静态字符串 GetIsSelectedContainerBinding(DependencyObject obj) {返回(字符串)obj.GetValue(IsSelectedContainerBindingProperty);}公共静态无效 SetIsSelectedContainerBinding(DependencyObject obj,字符串值){obj.SetValue(IsSelectedContainerBindingProperty, value);}//使用 DependencyProperty 作为 IsSelectedContainerBinding 的后备存储.这可以启用动画、样式、绑定等...public static readonly DependencyProperty IsSelectedContainerBindingProperty =DependencyProperty.RegisterAttached("IsSelectedContainerBinding", typeof(string), typeof(helper), new PropertyMetadata(null, IsSelectedContainerBindingPropertyChangedCallback));公共静态无效 IsSelectedContainerBindingPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) {BindingOperations.SetBinding(d, ListViewItem.IsSelectedProperty, new Binding() {来源 = d,Path = new PropertyPath("Content." + e.NewValue),模式 = BindingMode.TwoWay});}}

<块引用>

现在把 setter 改成这样: