C# ListViewItem IsSelected绑定-适用于WPF,但不适用于WinRT

C# ListViewItem IsSelected绑定-适用于WPF,但不适用于WinRT,c#,xaml,windows-runtime,winrt-xaml,C#,Xaml,Windows Runtime,Winrt Xaml,我正在尝试将ListViewItem的IsSelected属性绑定到ViewModel中的属性。它在WPF中运行良好,但在WindowsRT中,永远不会设置IsSelected属性 public class Item : INotifyPropertyChanged { private readonly string name; private bool isSelected; public event PropertyChangedEventHandler Proper

我正在尝试将ListViewItem的IsSelected属性绑定到ViewModel中的属性。它在WPF中运行良好,但在WindowsRT中,永远不会设置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<Item> items = new ObservableCollection<Item>(Enumerable.Range(0, 10).Select(p => new Item(p.ToString())));
    public ObservableCollection<Item> Items { get { return items; } }
}

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        DataContext = new ViewModel();
    }
}
公共类项:INotifyPropertyChanged
{
私有只读字符串名称;
私人布尔当选;
公共事件属性更改事件处理程序属性更改;
公选学校
{
获取{return isSelected;}
集合{isSelected=value;RaisePropertyChanged(“isSelected”);}
}
公共字符串名称{get{return Name;}}
公共项(字符串名称)
{
this.name=名称;
}
受保护的void RaisePropertyChanged(字符串propertyName)
{
var handler=PropertyChanged;
if(处理程序!=null)
Invoke(这是新的PropertyChangedEventArgs(propertyName));
}
}
公共类视图模型
{
private readonly ObservableCollection items=新的ObservableCollection(Enumerable.Range(0,10).Select(p=>new Item(p.ToString()));
公共ObservableCollection项{get{return Items;}}
}
公共密封部分类主页面:第页
{
公共主页()
{
this.InitializeComponent();
DataContext=新的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);
        }
    }
或者,您似乎也可以使用


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

ForInfo和ehuna的积分:

您能提供一个链接吗?我真的不知道要搜索什么。请看我对这个问题的回答:我正在使用WinRT Xaml工具包扩展。它工作正常。我正在使用WinRT Xaml工具包扩展。它工作正常。感谢Xaml工具包似乎只对我单向工作,即使使用Mode=TwoWay。如果我在ListView中选择某个对象,它不会更新ViewModel?
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);
        }
    }
<ListView
            x:Name="lv"
            Grid.Row="1"
            Grid.Column="1"
            SelectionMode="Multiple"
            HorizontalAlignment="Left"
            Width="500">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextBlock
                        Extensions:ListViewItemExtensions.IsSelected="{Binding IsSelected}"
                        Extensions:ListViewItemExtensions.IsEnabled="{Binding IsEnabled}"
                        Text="{Binding Text}"
                        Margin="15,5"
                        FontSize="36" />
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>