2

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

  • 当我通过 GUI 在 ListView 中选择一个项目时,“SelectedItem”发生了变化。
  • 当我在 ViewModel 中更改“SelectedItem”时,ListView 仅在我将 SelectedItem 设置为 NULL 时更改。
  • 当我设置任何其他(有效!)对象(如 ObservableCollection 的第一个条目)时,ListView 会忽略它。

此外:当我想“否决”一个 SelectedItem 更改(因为未保存数据)时,ListView 会突出显示新的选定项,而不是 ViewModel 的 SelectedItem-Property。

我已经尝试将绑定更改为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>

我的视图模型:

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);
    }
  }
4

2 回答 2

2

为了从代码中选择任何集合控件中的选定项,选定项必须是绑定到该ItemsSource属性的集合中的实际项。LinQ如果您的收藏品至少有一个独特的属性,这可以很容易地实现:

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

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

于 2013-10-02T15:49:12.697 回答
1

我只是对 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-10-02T15:53:14.900 回答