[英]Data grid not update when data binding in xmal
我有一個稱為TimeSheetByEmployeeModel
的模型,該模型通過INotifyPropertyChanged
實現。
模型:
public class TimeSheetByEmployeeModel:INotifyPropertyChanged
{
//public string EmpID { get; set; }
string _EmpID;
public string EmpID
{
get
{
return _EmpID;
}
set
{
if (_EmpID != value)
{
_EmpID = value;
RaisePropertyChange("EmpID");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChange(string prop)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
}
}
ViewModel:
ObservableCollection<TimeSheetByEmployeeModel> _TimeSheetList = new ObservableCollection<TimeSheetByEmployeeModel>();
public ObservableCollection<TimeSheetByEmployeeModel> TimeSheetList
{
get
{
return _TimeSheetList;
}
set
{
_TimeSheetList = value;
}
}
查看隱藏代碼:
public TimeSheetByEmployee()
{
InitializeComponent();
this.DataContext = this;
}
視圖:
<DataGrid ItemsSource="{Binding TimeSheetList,UpdateSourceTrigger=PropertyChanged}"
AutoGenerateColumns="False"
CanUserAddRows="False"
x:Name="timesheetgrid"
HeadersVisibility="All"
RowHeaderWidth="20">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding EmpID,UpdateSourceTrigger=PropertyChanged}"
Header="EmpID"
IsReadOnly="True"
Width="100"/>
</DataGrid.Columns>
</DataGrid>
當我單擊視圖內的按鈕時,它將調用此方法:
private void Ok_Click(object sender, RoutedEventArgs e)
{
try
{
TimeSheetList.Clear();
string EmployeeID = cboemployee.SelectedValue.ToString();
TimeSheetList = TimeSheetByEmployeeDataAccessor.GetTimeSheetByEmployee_ByFromTo(dtpfrom.SelectedDate.GetValueOrDefault(), dtpto.SelectedDate.GetValueOrDefault(), EmployeeID);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
我動態更改了TimeSheetList
,它應該反映在datagrid中。 我使用這種結構開發了另一種形式,並且效果很好。 但是,以這種形式,當我更改TimeSheetList
它不會更新datagrid。
我研究了什么?
首先,我將一些數據綁定到視圖構造函數中的TimeSheeList
,並將其顯示在datagrid中。 因此,我假定將TimeSheetList
綁定到datagrid工程。
其次,我在Button Click Event中更改了一些代碼:
private void Ok_Click(object sender, RoutedEventArgs e)
{
try
{
TimeSheetList.RemoveAt(0);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
這段代碼非常完美,可以刪除數據網格中的第一行。 因此,我假設datagrid項源是動態變化的。
但是為什么不使用我的原始代碼進行更新?
更多研究,
我向按鈕添加了代碼:
timesheetgrid.ItemsSource = TimeSheetList;
我知道它會工作,而且確實可以,但是通常我不會在后台代碼中將數據綁定到數據網格,而我總是在XAML中進行數據綁定。 它始終有效,但為什么在這里不起作用?
更新資料
如果在調試時將Mode=TwoWay
添加到xaml的datagrid中的ItemsSource數據綁定中,則如下所示:
<DataGrid
ItemsSource="{Binding TimeSheetList,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"
AutoGenerateColumns="False"
CanUserAddRows="False"
x:Name="timesheetgrid"
HeadersVisibility="All"
RowHeaderWidth="20">
它可以工作,並且datagrid顯示數據。 因此,我保存並重新啟動了調試過程,它再次停止工作。
這行:
TimeSheetList = TimeSheetByEmployeeDataAccessor.GetTimeSheetByEmployee_ByFromTo(dtpfrom.SelectedDate.GetValueOrDefault(), dtpto.SelectedDate.GetValueOrDefault(), EmployeeID);
創建一個新集合,setter中沒有有關更改的通知:
set
{
_TimeSheetList = value;
}
我建議避免更改集合並將項目添加到現有集合:
var items = TimeSheetByEmployeeDataAccessor.GetTimeSheetByEmployee_ByFromTo(dtpfrom.SelectedDate.GetValueOrDefault(), dtpto.SelectedDate.GetValueOrDefault(), EmployeeID);
TimeSheetList.Clear();
foreach(var item in items)
TimeSheetList.Add(item);
...或者如果您想更改收藏集(如現在完成),則發出通知
set
{
_TimeSheetList = value;
RaisePropertyChange("TimeSheetList");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.