【问题标题】:DataGrid is not bound to the ObservableCollectionDataGrid 未绑定到 ObservableCollection
【发布时间】:2017-08-16 07:48:53
【问题描述】:

我的视图中有一个按钮,可以在 ViewModel 中执行此方法:

public void GetAudits(Guid? userId, DateTime? from, DateTime? to, string form)
        {
            StringBuilder sCondition = new StringBuilder("WHERE 0=0");

            if (userId != null && userId != Guid.Empty)
                sCondition.Append(string.Format(" AND UserId = '{0}' ", userId));

            if (!string.IsNullOrEmpty(form))
                sCondition.Append(string.Format(" AND FormName = '{0}' ", form));


            string query = string.Format("SELECT * FROM Common.TbHistoryLog {0}", sCondition);
            Audits = new ObservableCollection<HistoryLog>(oContext.Database.SqlQuery<HistoryLog>(query).ToList());

        }

Audits 属性:

 public ObservableCollection<HistoryLog> Audits
    {
        get
        {
            return audits;
        }
        set
        {
            audits = value;
        }
    }
    ObservableCollection<HistoryLog> audits;

这是按钮的处理程序:

private void BtnSearch(object sender, RoutedEventArgs e)
        {
            var userId = ((TbUsers)cmbUsers.SelectedItem)?.UserId;
            var from = dtFromDate.Value;
            var to = dtToDate.Value;
            var form = ((BlCommon.TbObjects)cmbForms.SelectedItem)?.ObjectRealName;
            using (ClsUserTransactions oUserTrans = new ClsUserTransactions())
            {
                oUserTrans.GetAudits(userId, from, to, form);
            }
        }

但是当我单击按钮时,dataGrid 不会使用 Audits 集合进行更新:

<DataGrid  Name="gvHistory" Grid.Column="0" Grid.Row="9" Margin="2" Visibility="Visible" ItemsSource="{Binding Audits}" Grid.ColumnSpan="8" IsReadOnly="True" Grid.RowSpan="2"  AutoGenerateColumns="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" CanUserAddRows="False"/>

当我调试时,我注意到 getter 块没有被命中

【问题讨论】:

  • 在 ViewModel 中实现 INotifyPropertyChanged 并在 setter 中为“Audits”属性引发 PropertyChanged 事件
  • Observable 集合属性应该是只读的。它们向 UI 提供更改通知。在集合中添加和删除元素,不要替换集合。

标签: c# wpf mvvm datagrid observablecollection


【解决方案1】:

您为什么不简单地清除并重新填充相同的ObservableCollection?:

public void GetAudits(Guid? userId, DateTime? from, DateTime? to, string form)
{
    StringBuilder sCondition = new StringBuilder("WHERE 0=0");

    if (userId != null && userId != Guid.Empty)
        sCondition.Append(string.Format(" AND UserId = '{0}' ", userId));

    if (!string.IsNullOrEmpty(form))
        sCondition.Append(string.Format(" AND FormName = '{0}' ", form));


    string query = string.Format("SELECT * FROM Common.TbHistoryLog {0}", sCondition);
    if (Audits != null)
    {
        Audits.Clear();
        var newItems = oContext.Database.SqlQuery<HistoryLog>(query).ToList();
        if (newItems != null)
            foreach (var newItem in newItems)
                Audits.Add(newItem);
    }
}

其次,这会创建一个ClsUserTransactions新实例

ClsUserTransactions oUserTrans = new ClsUserTransactions())

您需要将项目添加到DataGrid 绑定的项目,并且您当然不应该在填充其审核集合后立即处置该实例...:

private void BtnSearch(object sender, RoutedEventArgs e)
{
    var userId = ((TbUsers)cmbUsers.SelectedItem)?.UserId;
    var from = dtFromDate.Value;
    var to = dtToDate.Value;
    var form = ((BlCommon.TbObjects)cmbForms.SelectedItem)?.ObjectRealName;
    ClsUserTransactions oUserTrans = gvHistory.DataContext as ClsUserTransactions;
    oUserTrans.GetAudits(userId, from, to, form);
}

【讨论】:

    【解决方案2】:

    您的 ViewModel 应该实现 INotifyPropertyChanged 接口,然后在 Audits setter 上通知属性更改:

    public class ViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
    ...
    

    -

    public ObservableCollection<HistoryLog> Audits
    {
        get
        {
            return audits;
        }
        set
        {
            audits = value;
            OnPropertyChanged("Audits");
        }
    }
    ObservableCollection<HistoryLog> audits;
    

    【讨论】:

      猜你喜欢
      • 2016-09-13
      • 2013-08-07
      • 2013-09-07
      • 2013-10-14
      • 2012-12-19
      • 1970-01-01
      • 2012-04-02
      • 1970-01-01
      相关资源
      最近更新 更多