簡體   English   中英

在xmal中進行數據綁定時數據網格未更新

[英]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.

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