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")
,它也不会启动。
我做错了什么?
如果您想通知集合的更改,您应该使用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)