WPF C # Получить выбранный элемент списка

1

У меня есть всплывающее окно 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), загружаемый списком строк, каждая строка, содержащая как имя, так и идентификатор, как эта

<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?

Теги:
wpf
data-binding
listview

1 ответ

0
Лучший ответ

Связывание SelectedItem установит значение в тип коллекции EmployeeCollection. Предположим, что EmployeeCollection является ObservableCollection<Employee>, вам нужно изменить SelectedEmployee из ListViewItem для Employee. Кроме того, убедитесь, что вы используете интерфейс INotifyPropertyChanged.

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

Если вы хотите только имя или идентификатор, то используйте 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");
    }
}
  • 0
    Спасибо за ваш ответ, Ли. Я не использую INotifyPropertyChanged и на самом деле я не знаю, как его использовать. Но я могу добавить, что когда я запускаю код, я получаю {MySolutionName.ViewModel.MainWindowViewModel.Employee} в качестве «значения» в свойстве набора SelectedEmployee. Почему я получаю адрес вместо содержимого строки?
  • 1
    Вы, должно быть, пропустили SelectedValuePath. Это должно быть требуемое свойство, например, Name или ID (если ID - это int, тогда измените SelectedEmployee на int). Он работает без SelectedValuePath, когда ваша коллекция представляет собой набор строк, но когда она является классом, вам нужно указать, какое свойство использовать.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню