我正在尝试学习MVVM(使用MVVMLight Toolkit)。但我被卡住了。
在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显示已填充的集合,没有任何更改。只有在加载视图时才会触发Collection的“get”。即使我RaisePropertyChanged("PhoneNumbers")
它也不会发射。
我做错了什么?
答案 0 :(得分:1)
如果您想通知收藏集的更改,请使用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>
答案 1 :(得分:0)
如果我没有弄错,重新初始化集合时绑定会被破坏。为了解决这个问题,你将不得不处理已经初始化的集合。例如:
使用
清除列表 PhoneNumbers.Clear()
使用
添加到列表中 PhoneNumbers.Add(item)
当您使用ObservableCollection时,您不需要提升属性更改事件以更新UI中的列表。如果您更改列表中项目的属性,则需要它。
答案 2 :(得分:0)
首先用
清除列表Clear()
然后添加项目
PhoneNumbers.Add(item)