ListViewItem IsSelected Binding – 适用于WPF,但不适用于WinRT

我正在尝试将ListViewItem的IsSelected属性绑定到ViewModel中的属性。 它在WPF中工作正常,但在Windows RT中,IsSelected属性永远不会被设置。

public class Item : INotifyPropertyChanged { private readonly string name; private bool isSelected; public event PropertyChangedEventHandler PropertyChanged; public bool IsSelected { get { return isSelected; } set { isSelected = value; RaisePropertyChanged("IsSelected"); } } public string Name { get { return name; } } public Item(string name) { this.name = name; } protected void RaisePropertyChanged(string propertyName) { var handler = PropertyChanged; if (handler != null) handler.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } public class ViewModel { private readonly ObservableCollection items = new ObservableCollection(Enumerable.Range(0, 10).Select(p => new Item(p.ToString()))); public ObservableCollection Items { get { return items; } } } public sealed partial class MainPage : Page { public MainPage() { this.InitializeComponent(); DataContext = new ViewModel(); } } 

XAML:

               

我可以单击屏幕上的项目,但IsSelected属性不会传播到ViewModel。 有什么想法吗?

从Windows 8.0开始,WinRT根本不支持setter中的绑定。 Bing需要解决方法。

一个好的简单方法是将ListView子类化

 public class MyListView : ListView { protected override void PrepareContainerForItemOverride(Windows.UI.Xaml.DependencyObject element, object item) { base.PrepareContainerForItemOverride(element, item); // ... ListViewItem listItem = element as ListViewItem; Binding binding = new Binding(); binding.Mode = BindingMode.TwoWay; binding.Source = item; binding.Path = new PropertyPath("Selected"); listItem.SetBinding(ListViewItem.IsSelectedProperty, binding); } } 

或者 ,您似乎也可以使用WinRT XAML Toolkit来完成它。

        

就个人而言,我使用了第一种方法,因为它更灵活,我需要绑定一些自动化属性。

ForInfo和ehuna的致谢: http ://social.msdn.microsoft.com/Forums/windowsapps/en-US/9a0adf35-fdad-4419-9a34-a9dac052a2e3/listviewitemisselected-data-binding-in-style-setter-is- 未工作