【问题标题】:WPF MVVM Update Datagrid when Combobox value changes当 Combobox 值更改时 WPF MVVM 更新 Datagrid
【发布时间】:2014-02-05 16:06:03
【问题描述】:

我有一个 WPF 应用程序,其中包含基于月份和年份填充的数据网格。使用 MVVM 模式,当用户更改月份或年份选择值时,如何更新数据网格?

查看

<ComboBox DockPanel.Dock="Left" Name="comboBoxMonth" ItemsSource="{Binding Months}" SelectedItem="{Binding SelectedMonth}" TabIndex="0"></ComboBox>
<ComboBox DockPanel.Dock="Left" Name="comboBoxYear" ItemsSource="{Binding Years}" SelectedItem="{Binding SelectedYear}" TabIndex="0"></ComboBox>

<DataGrid AutoGenerateColumns="True" ItemsSource="{Binding BudgetEntries}"></DataGrid>

视图模型

public class BudgetEntryViewModel : INotifyPropertyChanged
{
    private FinancialManagement4MEContext context = new FinancialManagement4MEContext();
    private int _SelectedMonth = GetDefaultMonth();
    private ObservableCollection<int> _Years;
    private int _SelectedYear = GetDefaultYear();
    private ObservableCollection<BudgetEntry> _BudgetEntries;
    private static int GetDefaultMonth()
    {
        int _monthnumber = DateTime.Now.Month;

        if (_monthnumber == 1) { _monthnumber = 12; }
        else { _monthnumber--; }

        return _monthnumber;
    }

    private static int GetDefaultYear()
    {
        int _year = DateTime.Now.Year;

        if (DateTime.Now.Month == 1) { _year--; }

        return _year;
    }

    public BudgetEntryViewModel()
    {
        _BudgetEntries = new ObservableCollection<BudgetEntry>((from b in context.BudgetEntries
                                                                where b.Year == _SelectedYear & b.Month == _SelectedMonth
                                                                select b).ToList());
    }

    public ObservableCollection<int> Months
    {
        get
        {
            ObservableCollection<int> _months = new ObservableCollection<int>();

            for (int i = 1; i <= 12; i++)
            {
                _months.Add(i);
            }

            return _months;
        }
    }

    public int SelectedMonth
    {
        get 
        { 
            return _SelectedMonth; 
        }
        set 
        {
            if (_SelectedMonth != value)
            {
                _SelectedMonth = value;
                RaisePropertyChanged("SelectedMonth");
            }
        }
    }

    public ObservableCollection<int> Years
    {
        get
        {
            _Years = new ObservableCollection<int>(((from b in context.BudgetEntries
                                                     select b.Year).ToList<int>().Distinct()).ToList());

            if (DateTime.Now.Month == 2 && DateTime.Now.Year > _Years.Max())
            {
                _Years.Add(DateTime.Now.Year);
            }

            return _Years;
        }
    }

    public int SelectedYear
    {
        get
        {
            return _SelectedYear;
        }
        set
        {
            if (_SelectedYear != value)
            {
                _SelectedYear = value;
                RaisePropertyChanged("SelectedYear");
            }
        }
    }

    public ObservableCollection<BudgetEntry> BudgetEntries
    {
        get 
        {
            return _BudgetEntries;
        }
        set
        {
            _BudgetEntries = value;
        }
    }

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

    public event PropertyChangedEventHandler PropertyChanged;
}

【问题讨论】:

    标签: c# wpf mvvm datagrid combobox


    【解决方案1】:

    你可以在设置方法中做到这一点

    public int SelectedMonth
    {
        get 
        { 
            return _SelectedMonth; 
        }
        set 
        {
            if (_SelectedMonth != value)
            {
                 _SelectedMonth = value;
                 RaisePropertyChanged("SelectedMonth");
                 UpdateData(); // This private method updates BudgetEntries collection
            }
        }
    }
    

    请注意,这会阻塞 UI 线程,因此如果您正在执行一些长时间的操作,例如 DB 查询,请确保使用异步调用

    例如Task

    private void UpdateData()
    {
        IsBusy = true;
        Task.Factory.CreateNew(()=>LongDBQuery())
                    .ContinueWith(t =>
                                  {
                                       if(t.Exception != null)
                                       {
                                            //Show Error Message
                                            return;
                                       }
                                       BudgetEntries = t.Result;
                                  }
                                  , TaskScheduler.FromCurrentSynchronizationContext());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 2018-04-15
      • 2013-11-30
      • 2019-09-11
      • 2014-05-15
      • 1970-01-01
      • 2022-01-11
      相关资源
      最近更新 更多