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プロパティにバインドされていますが、セッターは使用されていないため、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は、save executeメソッドから呼び出すか、何かが変更されたことをUIに通知する必要がある他の場所から呼び出すことは完全に合法です。

それを行うための最良の方法ですか?おそらく、個人的には、MVVMパッテンの使用を検討することはないでしょう。しかし、繰り返しになりますが、それがあなたのために機能するのであれば、それは何も悪いことではありません。

于 2012-11-15T18:56:34.317 に答える