DataGrid不使用ObservableCollection进行更新

时间:2014-04-17 07:34:14

标签: c# wpf mvvm datagrid observablecollection

我正在尝试学习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")它也不会发射。

我做错了什么?

3 个答案:

答案 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)