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的主要内容,如果未能解决你的问题,请参考以下文章

C# wpf listview 如何动态添加 高手回答下

C# wpf listview 如何得到按钮所在行?

wpf listview问题。给listview的每一行都加个button,button绑定该行。

WPF:如何在拖动 ListView 项目时允许在 ListView 中使用鼠标滚轮滚动?

深入探讨WPF的ListView控件

wpf listview images