WPF ListView忽略SelectedItem更改

WPF ListView忽略SelectedItem更改,wpf,listview,binding,Wpf,Listview,Binding,我正在使用WPF中的ListView,它绑定在一个可观察的集合中。然后,我将SelectedItem属性绑定到ViewModel的一个属性 当我通过GUI在ListView中选择一个项目时,“SelectedItem”被更改 当我在ViewModel中更改“SelectedItem”时,ListView仅在我将SelectedItem设置为NULL时更改 当我设置任何其他(有效!)对象(如ObservableCollection的第一个条目)时,ListView会忽略它 此外:当我想“否决”

我正在使用WPF中的ListView,它绑定在一个可观察的集合中。然后,我将SelectedItem属性绑定到ViewModel的一个属性

  • 当我通过GUI在ListView中选择一个项目时,“SelectedItem”被更改
  • 当我在ViewModel中更改“SelectedItem”时,ListView仅在我将SelectedItem设置为NULL时更改
  • 当我设置任何其他(有效!)对象(如ObservableCollection的第一个条目)时,ListView会忽略它
此外:当我想“否决”SelectedItem更改(因为数据未保存)时,ListView会突出显示新的选定项,而不是ViewModel的SelectedItem属性

我已经尝试将绑定更改为
Mode=TwoWay
-也不起作用(否则,将“NULL”更改为SelectedItem也不起作用)

这是视图中的代码:

<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);
    }
  }
public-observeCollection配置{get;private-set;}
private UserConfigurationViewModel\u selectedUserConfiguration;
公共用户配置视图模型选择的用户配置
{
获取{
返回此项。\ u选择了SERConfiguration;
}
设置
{
if(this.\u selectedUserConfiguration!=null&&this.\u selectedUserConfiguration.WasChanged)
{
如果(询问用户)
{
这是。_selectedUserConfiguration.Reset();
这是。\ u selectedUserConfiguration=值;
}
}
其他的
{
这是。\ u selectedUserConfiguration=值;
}
NotifyOfPropertyChange(()=>this.SelectedUserConfiguration);
}
}

要从代码中选择任何集合控件中的所选项目,所选项目必须是绑定到
ItemsSource
属性的集合中的实际项目。如果您的收藏项目至少有一个唯一属性,则使用
LinQ
可以很容易地实现这一点:

SelectedUserConfiguration = Configurations.Where(c => c.UniqueProperty == 
    valueOfItemToSelect).FirstOrDefault();

如果您的数据类型对象没有唯一的属性,您可以简单地为此添加一个
int Id
属性。

我刚刚遇到了TabControl的相同问题

我试图创建一个int属性并将其绑定到SelectedIndex,但没有成功

奇怪的是,这确实起了作用:

在ListView集中
IsSynchronizedWithCurrentItem=“True”

设置一个
ListView.Resources
,如下所示:

<ListView.Resources>
    <Style TargetType="ListViewItem" x:Key="ListViewTemplate">
          <Setter Property="IsSelected" Value="True" />
    </Style>
</ListView.Resources>


我只是猜测,问题可能是ListView的
SelectedItem
属性的类型是
object
,而您的
SelectedUserConfiguration
属性的类型是
UserConfigurationViewModel
?如何解决这个问题?