0

当我只想更改绑定数据时,如何防止触发 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。

4

2 回答 2

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);
        }            
    }
}
于 2013-10-31T07:50:03.947 回答
0

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

于 2013-11-03T19:59:45.437 回答