【问题标题】:Updating Datagrid After Query in WPF with MVVM使用 MVVM 在 WPF 中查询后更新 Datagrid
【发布时间】: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>

【问题讨论】:

    标签: c# sql wpf mvvm datagrid


    【解决方案1】:

    尝试从 ViewModel 中的 INotifyPropertyChanged 继承

    public class ResultViewModel : INotifyPropertyChanged
    

    并向您的列表视图添加通知:

    private ObservableCollection<Result> _Results;
    
    public ObservableCollection<Result> Results 
    {
        get { return this._Results; }
    
        set
        {
            this._Results= value;
            RaisePropertyChanged("Results");           
        }
    }
    

    【讨论】:

    • 就像它一样有效。非常感谢你!您节省了我很多时间尝试在互联网深处寻找答案。
    • 很高兴为您提供帮助,更改在您的结果中,结果属性在您的 ViewModel 中,如果您不通知视图,视图如何知道更改?答案是您的 VM 中的 INotifyPropertyChanged。
    • 有道理。一个很好的教训,在 MVVM 旅程上又向前迈进了一步。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多