2017-02-20 7 views
0

私はmvvmLight-frameworkと協力しています。私は2つのusercontrolsを持っています。mvvmLightでデータを保存した後でdataGridを更新するには?

つのUserControl(objectInspector)は、データを保存するためのものです:

<Button Command="{Binding ObjectModel.OkCommand}" /> 

これは、ビューモデルにバインドされている "objectInspectorViewModel"。

他のユーザーコントロール(アウトライン)は、それがのviewmodel「outlinerViewModel」に結合している

    <DataGrid ItemsSource="{Binding Path=ObjectModels, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
           Grid.Row="0" 
           AutoGenerateColumns="False"> 
         <DataGrid.Columns> 
          <DataGridTextColumn Binding="{Binding Id}" Header="ID"></DataGridTextColumn> 
          <DataGridTextColumn Binding="{Binding Name}" Header="Name"></DataGridTextColumn> 
          <DataGridTextColumn Binding="{Binding Length}" Header="Length"></DataGridTextColumn> 
          <DataGridTextColumn Binding="{Binding Height}" Header="Height"></DataGridTextColumn> 
          <DataGridTextColumn Binding="{Binding Width}" Header="Width"></DataGridTextColumn> 
          <DataGridTextColumn Binding="{Binding Type}" Header="Type"></DataGridTextColumn> 
         </DataGrid.Columns> 
        </DataGrid> 

データの全てを提示/ローディングするためのものです。

読み込みと保存が正常に動作します。しかし、私が望むのは、新しいオブジェクトを保存した後で、DataGridをリフレッシュすることです。

マイOutlinerViewModelは次のようになります。

public class OutlinerViewModel : BaseViewModel 
    { 
     public List<ObjectModel> ObjectModels { get; set; } 

     public OutlinerViewModel() 
     { 
      string file = [email protected]"{Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.Parent.FullName}\DataSource\objects.csv"; 
      ObjectModels = ReadFile(file); 
     } 
     [...] 
    } 

私ObjectInspectorViewModelは、次のようになります。

public class ObjectInspectorViewModel : BaseViewModel 
{ 
    public ObjectModel ObjectModel { get; set; } = new ObjectModel(); 
} 

そして、これはObjectModelから「」データベース「」に新しいオブジェクトを保存するための方法であり、 :

public RelayCommand OkCommand { get; private set; } 

    protected override void InitCommands() 
    { 
     base.InitCommands(); 

     OkCommand = new RelayCommand(
      () => 
      writeToCsv(
       [email protected]"{Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.Parent.FullName}\DataSource\objects.csv", 
       this.ToString()), 
      () => IsOk); 
    } 

MvvmLiでデータを保存した後でdataGridを更新する方法ght?

答えて

1

List<ObjectModel>ObservableCollection<ObjectModel>に変更してください。 それは簡単なはずです。

更新

また、PropertyChangedを上げます。

private ObservableCollection<ObjectModel> objectModels; 
public ObservableCollection<ObjectModel> ObjectModels 
{ 
    get 
    { 
     return onjectModels; 
    } 
    set 
    { 
     objectModels = value; 
     OnPropertyChanged(); 
    } 
} 

ビューモデルがINotifyPropertyChangedを実装していると仮定します。このように実装することができます。

public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged([CallerMemberName] string propertyName=null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
+0

ありがとうございます。 'List ObjectModels'を' OutlinerViewModel'から 'ObjectModel'クラスに移動し、タイプをObservableCollection と再定義しました。私はDataGridを 'ObjectModel.ObjectList'にリバウンドさせます。私の 'writeToCsv()'メソッドでは、リストを更新します! – Chpo7234

2

Personnaly、私は自分のビューをデータベースのデータで最新にしたいと思っています。 要素を保存すると、そこからデータを取得してDataGridを更新します。 この方法では、同期の問題はありません。パフォーマンスが重要な場合は、保存した要素のみを更新しようとすることができます。 あなたの場合、私はちょうどオブジェクトを保存した後に "readFile"メソッドを呼び出すでしょう。ところで

、すべてのObjectModelのプロパティは、あなたのViewModelにRaisePropertyChangedを呼び出す必要があります。このような

何か:

private long IdProperty; 
    public long Id 
    { 
     get { return IdProperty; } 
     set { IdProperty = value; RaisePropertyChanged(() => Id); } 
    } 

    private long NameProperty; 
    public long Name 
    { 
     get { return NameProperty; } 
     set { NameProperty = value; RaisePropertyChanged(() => Name); } 
    } 

この方法では、すべてのプロパティがビューに更新され、それらが変更されているとき。 (RaisePropertyChangedにはViewModelBaseクラスが付属しています)

+0

ありがとうございます。今度は、新しいオブジェクトを保存した後、(観測可能な)オブジェクトリストを更新しています。良いヒント。ソリューションの詳細については、他の回答のコメントをご覧ください。 – Chpo7234

関連する問題