私はさまざまなプログラミングの習慣に慣れているので、様々なMVVM
の例を試しています。MVVMを使用してWPFでクエリを実行した後でDatagridを更新する
このアプリで私は1つのビューを持っています。私はこれをコンボボックスから選択して(これはハードコードされています)、SQL
クエリを実行した後に選択した結果でデータグリッドを更新するようにします。
これまでのところ、私はResultViewModel
(using LoadResults();
)の作成時に結果の最初の多くを得ることが可能ですが、私は次のSQLクエリ(using OnUpdate();
)datagrid
が結果に更新されませんを実行したときに(私がいることをチェックしましたクエリはデバッグで正常に動作します)。
私は、チュートリアルから別のチュートリアルに行くときに何かを見逃してしまったと思います。 ResultViewModel
にINotifyPropertyChanged
を使用する必要があるかもしれないと感じていますが、実装しようとしていて動作させることができませんでした。
アドバイスをいただければ幸いです。ありがとう!
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>
そして、ちょうどそのような働くどうもありがとうございました!あなたはインターネットの深みで答えを見つけようと多くの時間を節約しました。 – AndyC
お世話になりました。あなたの結果と結果のプロパティに変更があります。ViewModelに通知していない場合、ビューは変更についてどのように知っていますか?答えはあなたのVMでINotifyPropertyChangedです。 – MyB
意味があります。 MVVMの旅を学び、もう一つのステップを踏み出しました。再度、感謝します。 – AndyC