ObservableCollection не обновляется из DataGrid - PullRequest
0 голосов
/ 24 марта 2020

После добавления данных в поле и перехода на вкладку или ввода ObservableCollection обновляется.

После добавления данных в поле и щелчка мышью вне поля ObservableCollection не обновляется.

Однако правильное значение остается в поле.

Чего мне не хватает?

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <DataGrid ItemsSource="{Binding People}" AutoGenerateColumns="False" Grid.Row="0" CanUserAddRows="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}" />
            <DataGridTextColumn Header="Last Name" Binding="{Binding LastName}" />
            <DataGridTemplateColumn Header="Add">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button Command="{x:Static local:MainWindowViewModel.AddPerson}" Content="Add"  />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
    <Button Content="Check Collection" Command="{Binding PrintPeople}" Grid.Row="1"/>
</Grid>
public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class MainWindowViewModel : BindableBase
{
    public static DelegateCommand AddPerson { get; set; }
    public DelegateCommand PrintPeople { get; set; }

    public ObservableCollection<Person> People { get; set; } = new ObservableCollection<Person>()
    {
        new Person() {FirstName = "Jane", LastName = "Doe" },
    };

    public MainWindowViewModel()
    {
        AddPerson = new DelegateCommand(ExecuteAddPerson);
        PrintPeople = new DelegateCommand(ExecutePrintPeople);
    }

    private void ExecuteAddPerson()
    {
        Person person = new Person();
        People.Add(person);
    }

    private void ExecutePrintPeople()
    {
        foreach (Person person in People)
        {
            Console.WriteLine(person.FirstName + " " + person.LastName);
        }
    }
}

Я использовал призму в примере.

1 Ответ

0 голосов
/ 24 марта 2020

Реализация класса Person как BindableBase

public class Person : BindableBase
{
    private string _firstName;
    private string _lastName;

    public string FirstName
    {
        get { return _firstName; }
        set { SetProperty(ref _firstName, value); }
    }

    public string LastName
    {
        get { return _lastName; }
        set { SetProperty(ref _lastName, value); }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...