2017-01-09 9 views
0

私はさまざまなプログラミングの習慣に慣れているので、様々なMVVMの例を試しています。MVVMを使用してWPFでクエリを実行した後でDatagridを更新する

このアプリで私は1つのビューを持っています。私はこれをコンボボックスから選択して(これはハードコードされています)、SQLクエリを実行した後に選択した結果でデータグリッドを更新するようにします。

これまでのところ、私はResultViewModelusing LoadResults();)の作成時に結果の最初の多くを得ることが可能ですが、私は次のSQLクエリ(using OnUpdate();datagridが結果に更新されませんを実行したときに(私がいることをチェックしましたクエリはデバッグで正常に動作します)。

私は、チュートリアルから別のチュートリアルに行くときに何かを見逃してしまったと思います。 ResultViewModelINotifyPropertyChangedを使用する必要があるかもしれないと感じていますが、実装しようとしていて動作させることができませんでした。

アドバイスをいただければ幸いです。ありがとう!

ResultModel

public class ResultModel { } 

public class Result : INotifyPropertyChanged 
{ 
    private string theHomeTeam; 
    private string theVisitorTeam; 


    public string HomeTeam 
    { 
     get { return theHomeTeam; } 

     set 
     { 
      if (theHomeTeam != value) 
      { 
       theHomeTeam = value; 
       RaisePropertyChanged("HomeTeam"); 
      } 
     } 
    } 

    public string VisitorTeam 
    { 
     get { return theVisitorTeam; } 

     set 
     { 
      if (theVisitorTeam != value) 
      { 
       theVisitorTeam = value; 
       RaisePropertyChanged("VisitorTeam"); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void RaisePropertyChanged(string property) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(property)); 
     } 
    } 

} 

ResultViewModel.cs

パブリッククラスResultViewModel {

public ObservableCollection<Result> Results { get; set; } 

    private Result _selectedResult; 

    public MyICommand DeleteCommand { get; set; } 
    public MyICommand SaveCommand { get; set; } 
    public MyICommand UpdateCommand { get; set; } 

    public ResultViewModel() 
    { 
     LoadResults("Liverpool", "Everton"); 
     DeleteCommand = new MyICommand(OnDelete, CanDelete); 
     SaveCommand = new MyICommand(OnSave, CanSave); 
     UpdateCommand = new MyICommand(OnUpdate, CanUpdate); 
    } 


    public void LoadResults(string theHomeTeam, string theVisitorTeam) 
    { 
     ObservableCollection<Result> results = new ObservableCollection<Result>(); 

     string connectionString = ConfigurationManager.ConnectionStrings["AzureCon"].ConnectionString; 
     string CmdString = string.Empty; 

     using (SqlConnection con = new SqlConnection(connectionString)) 
     { 
      CmdString = "SELECT * FROM tblEnglishLeagueResults WHERE elrHomeTeam = '" + theHomeTeam + "' AND elrVisitorTeam = '" + theVisitorTeam + "';"; 
      SqlCommand cmd = new SqlCommand(CmdString, con); 
      SqlDataAdapter sda = new SqlDataAdapter(cmd); 
      DataTable dt = new DataTable("Results"); 
      sda.Fill(dt); 

      foreach (DataRow row in dt.Rows) 
      { 
       results.Add(new Result { HomeTeam = Convert.ToString(row[3]), VisitorTeam = Convert.ToString(row[4]) }); 
      } 

     } 
     Results = results; 
    } 

    public Result SelectedResults 
    { 
     get { return _selectedResult; } 
     set 
     { 
      _selectedResult = value; 
      DeleteCommand.RaiseCanExecuteChanged(); 
      SaveCommand.RaiseCanExecuteChanged(); 
     } 
    } 

    private bool CanDelete() { return SelectedResults != null; } 

    private void OnDelete() { Results.Remove(SelectedResults); } 

    private bool CanUpdate() { return true; } 

    private void OnUpdate() { LoadResults("Liverpool", "Sunderland"); } 

    private bool CanSave() { return true; } 

    private void OnSave() { //SAVE LOGIC} 

}

ResultView.xaml

<DataGrid x:Name="grdResults" AutoGenerateColumns="False" ItemsSource="{Binding Results, Mode=TwoWay}"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding Path=HomeTeam}" Header="Home Team"/> 
      <DataGridTextColumn Binding="{Binding Path=VisitorTeam}" Header="Visitor Team"/> 
     </DataGrid.Columns> 
    </DataGrid> 

答えて

0

あなたのViewModelにINotifyPropertyChangedのから

public class ResultViewModel : INotifyPropertyChanged 

を継承し、あなたのリストのためのビューに通知を追加してください:

private ObservableCollection<Result> _Results; 

public ObservableCollection<Result> Results 
{ 
    get { return this._Results; } 

    set 
    { 
     this._Results= value; 
     RaisePropertyChanged("Results");   
    } 
} 
+0

そして、ちょうどそのような働くどうもありがとうございました!あなたはインターネットの深みで答えを見つけようと多くの時間を節約しました。 – AndyC

+0

お世話になりました。あなたの結果と結果のプロパティに変更があります。ViewModelに通知していない場合、ビューは変更についてどのように知っていますか?答えはあなたのVMでINotifyPropertyChangedです。 – MyB

+0

意味があります。 MVVMの旅を学び、もう一つのステップを踏み出しました。再度、感謝します。 – AndyC

関連する問題