【问题标题】:WPF ListView ignores SelectedItem-changeWPF ListView 忽略 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 类型吗?
  • 你是如何解决这个问题的?

标签: wpf listview binding


【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 2013-03-26
      • 2011-01-18
      • 2011-02-06
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 2018-07-07
      • 2023-03-25
      • 2010-11-27
      相关资源
      最近更新 更多