WPF ListView 忽略 SelectedItem-change
Posted
技术标签:
【中文标题】WPF ListView 忽略 SelectedItem-change【英文标题】:WPF ListView ignores SelectedItem-change 【发布时间】:2013-10-09 01:08:01 【问题描述】:我正在使用 WPF 中的 ListView,它绑定了一个可观察的集合。然后我将 SelectedItem-Property 绑定到 ViewModel 的一个属性。
当我通过 GUI 在 ListView 中选择一个项目时,“SelectedItem”发生了变化。 当我在 ViewModel 中更改“SelectedItem”时,只有当我将 SelectedItem 设置为 NULL 时,ListView 才会更改。 当我设置任何其他(有效!)对象(如 ObservableCollection 的第一个条目)时,ListView 会忽略它。此外:当我想“否决”一个 SelectedItem 更改(因为未保存数据)时,ListView 会突出显示新的选定项,而不是 ViewModel 的 SelectedItem-Property。
我已经尝试将 Binding 更改为 Mode=TwoWay
- 效果不佳(否则对 SelectedItem 的“NULL”更改将无法正常工作)
这是视图中的代码:
<ListView ItemsSource="Binding Configurations" SelectedItem="Binding SelectedUserConfiguration" SelectionMode="Single">
<ListView.View>
<GridView>
<GridViewColumn Header="User Configuration" DisplayMemberBinding="Binding ConfigurationName" Width="200" />
</GridView>
</ListView.View>
</ListView>
还有我的 ViewModel:
public ObservableCollection<UserConfigurationViewModel> Configurations get; private set;
private UserConfigurationViewModel _selectedUserConfiguration;
public UserConfigurationViewModel SelectedUserConfiguration
get
return this._selectedUserConfiguration;
set
if (this._selectedUserConfiguration != null && this._selectedUserConfiguration.WasChanged)
if (ask-user)
this._selectedUserConfiguration.Reset();
this._selectedUserConfiguration = value;
else
this._selectedUserConfiguration = value;
NotifyOfPropertyChange(() => this.SelectedUserConfiguration);
【问题讨论】:
我只是在猜测,问题可能是 ListView 的SelectedItem
属性是 object
类型,而您的 SelectedUserConfiguration
属性是 UserConfigurationViewModel
类型吗?
你是如何解决这个问题的?
【参考方案1】:
为了从代码中选择任何集合控件中的选定项,选定项必须是绑定到ItemsSource
属性的集合中的实际项。如果您的收藏品至少有一个独特的属性,则可以使用LinQ
轻松实现这一点:
SelectedUserConfiguration = Configurations.Where(c => c.UniqueProperty ==
valueOfItemToSelect).FirstOrDefault();
如果您的数据类型对象没有唯一属性,您可以简单地为此添加一个int Id
属性。
【讨论】:
【参考方案2】:我只是在 TabControl 上遇到了同样的问题。
我尝试创建一个 int 属性并将其绑定到 SelectedIndex,但没有成功。
奇怪的是,这成功了:
在您的 ListView 集中 IsSynchronizedWithCurrentItem="True"
像这样设置ListView.Resources
:
<ListView.Resources>
<Style TargetType="ListViewItem" x:Key="ListViewTemplate">
<Setter Property="IsSelected" Value="True" />
</Style>
</ListView.Resources>
【讨论】:
以上是关于WPF ListView 忽略 SelectedItem-change的主要内容,如果未能解决你的问题,请参考以下文章
wpf listview问题。给listview的每一行都加个button,button绑定该行。