WPF ListView忽略SelectedItem-change

时间:2013-10-02 15:18:25

标签: wpf listview binding

我正在使用WPF中的ListView(MAHApps样式的ListView)。我将ListView绑定到一个可观察的集合。我将SelectedItem-Property绑定到ViewModel的属性。

当我通过GUI选择ListView中的项目时,“SelectedItem”被更改。当我在ViewModel中更改“SelectedItem”时,ListView仅在我将SelectedItem设置为NULL时才会更改。当我设置任何其他(有效!)对象(如ObservableCollection的第一个条目)时,ListView只是忽略它。 此外:当我想要“Veto”一个SelectedItem Change(因为没有保存数据)时,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);
    }
  }

这是一个例子 - 这是在构造函数中调用的。试图实现一个测试按钮,选择最后一个,第一个和任何项目 - 没有任何工作......

if (this.Configurations.Count > 0)
{
  this.SelectedUserConfiguration = this.Configurations.First();
}

感谢您的帮助! 霍尔格

2 个答案:

答案 0 :(得分:2)

为了从代码中选择任何集合控件中的选定项目,所选项目必须是绑定到ItemsSource属性的集合中的实际项目。如果您的收藏品至少包含一个唯一属性,则可以使用LinQ轻松实现此目的:

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

如果您的数据类型对象没有唯一属性,则只需为此目的添加int Id属性。

答案 1 :(得分:0)

我在使用TabControl时遇到了同样的问题 我试图创建一个int属性并将其绑定到SelectedIndex,但没有成功。

奇怪的是,这就是诀窍:

在ListView集IsSynchronizedWithCurrentItem="True"
像这样设置ListView.Resources

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