WPF MVVM ListBox Выбранный элемент изменяется только в первый раз - PullRequest
0 голосов
/ 17 декабря 2018

Я хотел бы добавить, что я искал в Google, и поэтому я нашел ответ на этот вопрос до того, как опубликовал сообщение, но ни одно из решений не помогло мне.

Iя пытаюсь выбрать "Person" из списка WPF, и свойство моего viewmodel обновляется до выбранного "Person".Он отлично работает, когда я выбираю предмет в первый раз.После первого выбора переход на другой элемент не обновляет модель представления «Person».

ViewModel:

public class PersonViewModel : BaseViewModel
{
    private Person _selectedPerson;
    private ICommand _addToPeopleCommand;
    private ICommand _removeFromPeopleCommand;
    public Person NewPerson { get; set; }
    public Person SelectedPerson
    {
        get { return _selectedPerson; }
        set
        {
            _selectedPerson = value;
            OnPropertyChanged(nameof(SelectedPerson));
        }
    }
    public ObservableCollection<Person> PeopleList { get; set; }
    public ICommand AddToPeopleList
    {
        get
        {
            if (_addToPeopleCommand == null)
            {
                _addToPeopleCommand = new RelayCommand(
                    p => true,
                    p => this.PeopleList.Add(this.NewPerson));
            }
            return _addToPeopleCommand;
        }
    }

    public ICommand RemoveFromPeopleList
    {
        get
        {
            if (_removeFromPeopleCommand == null)
            {
                _removeFromPeopleCommand = new RelayCommand(
                    p => true,
                    p => this.PeopleList.Remove(SelectedPerson));
            }
            return _removeFromPeopleCommand;
        }
    }


    public PersonViewModel()
    {
        this.NewPerson = new Person();
        this.PeopleList = new ObservableCollection<Person>();
    }
}

BaseViewModel реализует INotifyPropertyChanged.В случае, если кому-то интересно.

И XAML:

<Window x:Class="MVVM_Test.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:viewModels="clr-namespace:MVVM_Test"
    d:DataContext="{d:DesignInstance viewModels:PersonViewModel}"
    mc:Ignorable="d"
    Title="MainWindow" Height="397" Width="525">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="300"/>
    </Grid.ColumnDefinitions>
    <TextBox Text="{Binding NewPerson.FirstName}" 
             Width="200"
             Grid.Row="0"/>
    <TextBox Text="{Binding NewPerson.LastName}" 
             Width="200"
             Grid.Row="1"/>
    <TextBox Text="{Binding NewPerson.FullName}" 
             Width="200"
             Grid.Row="2"
             IsReadOnly="True"/>
    <Button Grid.Row="3" 
            Content="Add"
            Margin="50,10,151,10"
            Command="{Binding AddToPeopleList}"/>
    <ListBox x:Name="listBox" 
             Margin="10,11,-206,-257"
             ItemsSource="{Binding PeopleList}"
             SelectedItem="{Binding SelectedPerson, UpdateSourceTrigger=PropertyChanged}"
             Grid.Row="4">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding FullName}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    <Button x:Name="remove" Content="Remove" 
            HorizontalAlignment="Left" 
            Margin="155,10,0,0" 
            Grid.Row="3" 
            VerticalAlignment="Top" 
            Width="75" 
            RenderTransformOrigin="0.067,0.9"
            Command="{Binding RemoveFromPeopleList}"
            CommandParameter="{Binding ElementName=listBox, Path=SelectedPerson}"/>
    <TextBlock x:Name="textBlock" 
               HorizontalAlignment="Left" 
               Margin="311,15,-206,0" 
               TextWrapping="Wrap" 
               Text="{Binding SelectedPerson.FullName}" 
               VerticalAlignment="Top" 
               Width="196" 
               Height="75" 
               Grid.RowSpan="4"/>
</Grid>

Конечная цель - выбрать человека из списка и удалить его из коллекции ObservableCollection.Я могу удалить людей из коробки до тех пор, пока не останется только один человек, после чего он перестанет работать.Однако, как уже упоминалось выше, когда я выбираю другого человека, после удаления одного из списка он больше не выбирает кого-либо для удаления.Выбор второго человека не вызовет сеттера во второй раз.Я даже протестировал его, включив TextBlock и привязав его к выбранному свойству person.Обновляется только один раз, в первый раз.

1 Ответ

0 голосов
/ 17 декабря 2018

Ваша команда AddToPeopleList снова и снова добавляет один и тот же экземпляр Person.Изменение метода добавления копии NewPerson в список может решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...