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