DataGrid未使用ObservableCollection进行更新

本文关键字:更新 ObservableCollection 未使用 DataGrid | 更新日期: 2023-09-27 17:58:40

我正在尝试学习MVVM(使用MVVMLight工具包)。但我被卡住了。

在ViewModel中有一个ObservableCollection

private ObservableCollection<Phone> _phoneNumbers;
public ObservableCollection<Phone> PhoneNumbers
{
    get { return _phoneNumbers; }
    private set
    {
        _phoneNumbers = value;
    }
}

在ViewModel中,构造函数以PhoneNumbers = new ObservableCollection<Phone>(Guest.Person.Phones); 的方式填充

视图中有

<DataGrid x:Name="PhoneNumbersDataGrid" HorizontalAlignment="Left" Grid.Column="3" Grid.Row="11" VerticalAlignment="Top" Height="86" Width="auto" ItemsSource="{Binding PhoneNumbers, Mode=OneWay}" AutoGenerateColumns="False" IsReadOnly="True">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding PhoneNumber}" Header="Phone Number" IsReadOnly="True"/>
        <DataGridTemplateColumn Header="Delete">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Command="{Binding Guest.DeletePhoneCommand, Mode=OneWay, Source={StaticResource Locator}}">Delete</Button>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

在DeletePhoneCommand中,我试图更改PhoneNumbers,例如

PhoneNumbers = new ObservableCollection<Phone>();
RaisePropertyChanged("PhoneNumbers");

集合变为空,但datagrid显示已填充的集合,没有任何更改。只有在加载视图时才会激发集合的"get"。即使我RaisePropertyChanged("PhoneNumbers"),它也不会启动。

我做错了什么?

DataGrid未使用ObservableCollection进行更新

如果您想通知集合的更改,您应该使用Mode = TwoWay

双向将使对象中的任何更改都能反映到UI中,而UI中的任何变化都能反映在对象中。

<DataGrid x:Name="PhoneNumbersDataGrid" HorizontalAlignment="Left" Grid.Column="3" Grid.Row="11" VerticalAlignment="Top" Height="86" Width="auto" ItemsSource="{Binding PhoneNumbers, Mode=TwoWay}" AutoGenerateColumns="False" IsReadOnly="True">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding PhoneNumber,Mode=TwoWay}" Header="Phone Number" IsReadOnly="True"/>
                <DataGridTemplateColumn Header="Delete">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Button Command="{Binding Guest.DeletePhoneCommand, Mode=OneWay, Source={StaticResource Locator}}">Delete</Button>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>

如果我没有错的话,在重新初始化集合时绑定会被破坏。要解决此问题,您必须处理已初始化的集合。例如:

使用清除列表

PhoneNumbers.Clear()

使用添加到列表

PhoneNumbers.Add(item)

当您使用ObservableCollection时,不需要引发属性更改事件来更新UI中的列表。如果更改列表中项目的属性,则需要它。

首先用清除列表

Clear()

然后添加项目

PhoneNumbers.Add(item)