【发布时间】:2017-01-09 14:04:06
【问题描述】:
我正在努力养成更好的编程习惯,所以我一直在研究各种MVVM 示例。
在这个应用程序中,我有一个视图。我希望它从组合框中获取用户选择的选项(现在这是硬编码的),并在运行 SQL 查询后使用所选结果更新数据网格。
到目前为止,我能够在创建 ResultViewModel (using LoadResults();) 时获得第一批结果,但是当我运行下一个 SQL 查询 (using OnUpdate();) 时,datagrid 不会更新结果(我已经检查了查询在调试中运行良好)。
我想我从一个教程转到另一个教程时错过了一些东西。我有一种感觉,我可能需要在 ResultViewModel 上使用 INotifyPropertyChanged,但我已经尝试实现它,但无法让它工作。
任何建议将不胜感激。谢谢!
结果模型
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>
【问题讨论】: