![](/img/trans.png)
[英]Calculated column in a dataGrid bound with a 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.