【发布时间】:2015-12-05 04:15:53
【问题描述】:
动态更改 ItemsPanel 时,ListView 的 SelectedItems 似乎有问题。我在 ListView 上实现了 MVVM,它的 ItemsSource 绑定到模型集合。该模型有 2 个属性,DisplayName(string) 和 Selected(bool)。并且列表视图的 DataContext 包含一个 ViewMode(bool) 属性。
设置是 ListViewItem 的 IsSelected 属性绑定到 Model 的 Selected 属性,当我通过单击按钮更改 ViewMode 时,ListView 的 ItemsPanel 会发生变化。
问题是当ListView中有选中项,ViewMode发生改变时,ListView的SelectedItems计数会增加,即使选中项没有改变。
注意:在我的设置中,ListView 中只有一项,但每次更改 ViewMode 时,SelectedItems 计数都会增加。
这是用于测试问题的应用程序的 xaml 部分。我认为您的专家可以完成 ViewModel/Model 部分。
<Window x:Class="WpfApplication5.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
Width="525"
Height="350">
<StackPanel>
<Button Command="{Binding ChangeViewModeCommand}"
Content="Change ViewMode" />
<ListView x:Name="list" ItemsSource="{Binding Models}">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="IsSelected" Value="{Binding Path=Selected, Mode=TwoWay}" />
<Setter Property="Content" Value="{Binding DisplayName}" />
</Style>
</ListView.ItemContainerStyle>
<ListView.Style>
<!-- Default ItemsPanel -->
<Style TargetType="ListView">
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<StackPanel />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<!-- Change ItemsPanel -->
<DataTrigger Binding="{Binding ViewMode}" Value="true">
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</ListView.Style>
</ListView>
<TextBlock Text="{Binding Path=SelectedItems.Count, ElementName=list, StringFormat=Selected Items Count:{0}}" />
</StackPanel>
</Window>
编辑
我正在添加 ViewModel 和 Model 类的代码。如您所见,它非常简单。
public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public ObservableCollection<Model> Models { get; private set; }
private bool viewMode;
public bool ViewMode
{
get { return viewMode; }
set
{
if (viewMode != value)
{
viewMode = value;
OnPropertyChanged("ViewMode");
}
}
}
public ICommand ChangeViewModeCommand
{
get { return new DelegateCommand(() => ViewMode = ViewMode ? false : true); }
}
public ViewModel()
{
Models = new ObservableCollection<Model>();
Models.Add(new Model() { DisplayName = "Model1" });
}
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
模型类
public class Model : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private bool isSelected;
public bool Selected
{
get { return isSelected; }
set
{
isSelected = value; OnPropertyChanged("Selected");
}
}
private string display;
public string DisplayName
{
get { return display; }
set { display = value; OnPropertyChanged("Display"); }
}
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
奇怪的是,尽管 Models 集合中只有 1 项,但 ListView.SelectedItems.Count 会增加。
谢谢
【问题讨论】:
-
您的 XAML 是正确的,显示您的
SelectedItems.Count的文本块正在做它应该做的事情。我认为问题一定在于您如何绑定到您的Selected(bool)属性。
标签: wpf listview mvvm data-binding