簡體   English   中英

DataGrid未綁定到ObservableCollection

[英]DataGrid is not bound to the ObservableCollection

我的視圖中有一個按鈕,可以在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"/>

當我調試時,我注意到沒有碰到吸氣塊

您為什么不簡單地清除並重新填充相同的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綁定的對象添加項目,並且在填充其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;
    ClsUserTransactions oUserTrans = gvHistory.DataContext as ClsUserTransactions;
    oUserTrans.GetAudits(userId, from, to, form);
}

您的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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM