0

我有一个绑定到 Players 属性的数据网格:

 <DataGrid HorizontalAlignment="Left" SelectedItem="{Binding CurrentPlayer}" Height="374" Margin="121,22,0,0" RowHeaderWidth="0" VerticalAlignment="Top" Width="836" ItemsSource="{Binding Players}" AutoGenerateColumns="false" IsReadOnly="True" SelectionMode="Single" IsEnabled="{Binding Editing, Converter={StaticResource InverseBooleanConverter}}" Grid.RowSpan="2" Grid.ColumnSpan="2">

这个 Players 属性定义如下:

public List<Player> Players
{
    get { return repository.Players.OrderBy(x => x.Firstname).ToList(); }
}

存储库包含来自 EF 的 DBSet。

添加播放器时,我使用以下代码:

private void SaveExecute(object parameter)
{
    repository.SavePlayer(currentPlayer);
    Editing = false;
}

我现在想做的很简单:创建新播放器时,数据网格应该刷新。它绑定到 Players 属性,但从未使用过 setter,因此无法在此处调用 RaisePropertyChange。

我被困在这里。如何正确绑定它,以便在调用 SavePlayer() 方法时,数据网格会更新并显示新玩家?

我找到的最简单的解决方案是调用 RaisePropertyChanged("Players"); 在 SaveExecute() 方法中:

private void SaveExecute(object parameter)
{
    repository.SavePlayer(currentPlayer);
    RaisePropertyChanged("Players");
    Editing = false;
}

但是......这是允许的还是你不应该做的事情?您是否应该只在属性的设置器中调用 RaiseProperyChanged 这也可以吗?

谢谢

4

2 回答 2

1

更改List<Player>ObservableCollection<Player>. 这是一种特殊类型的集合,当添加/删除项目时,它具有通知事件。WPF 会自动处理这些事件并相应地更新 UI。

然后在您的Save(),中Players.Add(newitem);,您将看到 UI 中反映的更改。

于 2012-11-15T20:23:07.577 回答
0

RaisePropertyChanged要回答您的问题,从您的保存执行方法或您需要让 UI 知道某些内容已更改的任何其他地方调用是完全合法的。

这是最好的方法吗?可能不会,就个人而言,我会考虑使用 MVVM 模式。但是话又说回来,如果它对您有用,那么它没有任何问题。

于 2012-11-15T18:56:34.317 回答