【问题标题】:WPF C# Get selected row item ListviewWPF C#获取选定的行项Listview
【发布时间】:2014-10-21 06:04:58
【问题描述】:

我有一个弹出 ListView,以这种方式声明:

<ListView x:Name="ShowFileLV" 
          ItemsSource="{Binding EmployeeCollection}" 
          DataContext="{Binding}" 
          SelectedItem="{Binding Path=SelectedEmployee}" 
          SelectionMode="Single">
    <ListView.View>
        <GridView>
            <GridViewColumn Width="140" 
                            DisplayMemberBinding="{Binding Name}">
                <GridViewColumnHeader Click="SortClick"   
                                      Tag="Name" 
                                      Content="Name" />
            </GridViewColumn>
            <GridViewColumn Width="140" 
                            DisplayMemberBinding="{Binding ID}">
                <GridViewColumnHeader Click="SortClick"
                                      Tag="ID" 
                                      Content="ID" />
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

列表和排序工作正常。我的问题是,我想在选择一行时直接更新 SelectedEmployee(不确定 ListViewItem 是否是正确的选择),甚至更好,只获取 ID 或名称:

public ListViewItem SelectedEmployee
{
    get
    {
        return _selectedEmployee;
    }
    set
    {
        _selectedEmployee= value;           
    }
}

这一直有效,直到我使用了一个加载了字符串列表的 ListBox(而不是 ListView),每个字符串都包含名称和 ID,就像这个

<ListBox Name="ShowFileLV" 
         SelectionMode="Single" 
         SelectedValue="{Binding Path=Employee}" 
         Style="{StaticResource ListBoxStyle}" ItemsSource="{Binding Path=ListPopupItems}" >
</ListBox>

使用公共字符串,例如:

public String Employee
{
    get
    {
        return _employee;
    }
    set
    {
        _employee= value;
        OnPropertyChanged("Employee");
    }
}

当我选择一行时,它会自动设置公共字符串 Employee,无需代码。 我如何使用 ListView 和 Collections 来完成他的工作?

【问题讨论】:

    标签: c# wpf listview data-binding


    【解决方案1】:

    SelectedItem 绑定会将值设置为集合 EmployeeCollection 中的类型。因此,假设 EmployeeCollection 是 ObservableCollection&lt;Employee&gt;,您需要将 SelectedEmployee 从 ListViewItem 更改为 Employee。另外,请确保您使用的是INotifyPropertyChanged 接口。

    public Employee SelectedEmployee
    {
        get
        {
            return _selectedEmployee;
        }
        set
        {
            _selectedEmployee= value;
            RaisePropertyChanged("SelectedEmployee");
        }
    }
    

    如果您只需要名称或 ID,则使用 SelectedValue 和 SelectedValuePath 而不是 SelectedItem。

    <ListView x:Name="ShowFileLV" 
              ItemsSource="{Binding EmployeeCollection}" 
              DataContext="{Binding}" 
              SelectedValue="{Binding Path=SelectedEmployee}"
              SelectedValuePath="Name"
              SelectionMode="Single"> 
    
    public string SelectedEmployee
    {
        get { return _selectedEmployee; }
        set
        {
           _selectedEmployee = value;
           RaisePropertyChanged("SelectedEmployee");
        }
    }
    

    【讨论】:

    • 谢谢你的回复李。我没有使用 INotifyPropertyChanged,实际上我不知道如何使用它。但是我可以补充一点,当我运行代码时,我在 SelectedEmployee 的 set 属性中将 {MySolutionName.ViewModel.MainWindowViewModel.Employee} 作为“值”。为什么我得到的是地址而不是行内容?
    • 您一定错过了 SelectedValuePath。这应该是您想要的属性,例如 Name 或 ID(如果 ID 是 int 则将 SelectedEmployee 更改为 int)。当你收集的是一堆字符串时,它在没有 SelectedValuePath 的情况下工作,但是当它是一个类时,你需要告诉它要使用哪个属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 2011-04-24
    相关资源
    最近更新 更多