ListView中的不需要的选择事件

时间:2013-10-30 22:51:03

标签: c# listview mvvm winrt-xaml

当我只想更改绑定数据时,如何防止激活ListView选择更改事件?

为了澄清,我有这样的课程:

public class MyCollectionViewModel : BindableBase
{
    public ObservableCollection<MyItemViewModel> MyItems { get; set; }

    private MyItemViewModel _selectedItem;
    public MyItemViewModel SelectedItem
    {
        get { return _selectedItem; }
        set
        {
            this.SetProperty(ref _selectedItem, value);

            if (_selectedItem != null)
            {
                // Do something...
            }
        }
    }
    ...
}

public class MyItemViewModel : BindableBase
{
        private bool _isSelected;
        public bool IsSelected
        {
            get { return _isSelected; }
            set { this.SetProperty(ref _isSelected, value); }
        }
        ...
}

使用以下数据模板:

<DataTemplate x:Key="MyItemTemplate">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <CheckBox Margin="10" IsChecked="{Binding Path=IsSelected, Mode=TwoWay}" />
        <Border Grid.Column="1">
            ...
        </Border>
    </Grid>
</DataTemplate>

......并像这样使用:

<ListView ItemsSource="{Binding Source={StaticResource SessionsViewSource}}"
          ItemTemplate="{StaticResource MyItemTemplate}"
          SelectedItem="{Binding Sessions.SelectedItem, Mode=TwoWay}"
          IsSwipeEnabled="False" />

稍微可视化ListView:

   +---------------------
   + [x]  myItem1
   +---------------------
   + [ ]  myItem2
   +---------------------

用户可以选中并取消选中复选框。问题是,如果存在选择,当IsSelected绑定更新时,选择绑定也会发生。

有没有一种简单的方法来解决这个问题?我想尽可能地坚持使用MVVM。

2 个答案:

答案 0 :(得分:0)

替换你的财产
public MyItemViewModel SelectedItem
{
    get { return _selectedItem; }
    set
    {
        if (value.IsSelected)
        {
            this.SetProperty(ref _selectedItem, value);
        }
        // Optional: if you require
        else
        {
            this.SetProperty(ref _selectedItem, null);
        }            
    }
}

答案 1 :(得分:0)

只需删除SelectedItem="{Binding Sessions.SelectedItem}"不需要您,您将从复选框绑定中收到正确的选择。您还应该将ListView SelectionMode更改为None。这令人困惑,因为你的财产被称为IsSelected。将其命名为IsChecked,专注于此并删除任何选择功能。您甚至可以通过ListView降级到ItemsControl。