2015-09-24 145 views
0

我有用caseRefNo,subjrMatr填充的datagrid,下载数据。我的背景工作正在运行并返回caseRefNo和下载百分比。我使用DispatcherTimer根据caseRefNo更新下载百分比(每3秒)。刷新datagrid时Datagrid复选框选择丢失WPF MVVM

我可以显示通过caseRefNo过滤的datagrid中的下载百分比。问题从这里开始。我无法检查我的复选框,因为DispatcherTimer刷新了我绑定到datagrid的CollectionView。

enter image description here

这里是我的ViewModel的源代码。

public class DataGridDownloadViewModel:BindableBase 
{ 
    public ObservableCollection<tblTransaction> TransList { get; private set; } 
    public DispatcherTimer dispatchTimer = new DispatcherTimer(); 
    public CollectionView TransView { get; private set; } 

    private String _UpdatePer; 
    public String UpdatePercentage 
    { 
     get { return _UpdatePer; } 
     set { SetProperty(ref _UpdatePer, value); } 
    } 

    private string _caseId; 
    public string CaseID 
    { 
     get { return _caseId; } 
     set { SetProperty(ref _caseId, value); } 
    } 

    public DataGridDownloadViewModel(List<tblTransaction> model) 
    { 
     dispatchTimer.Interval = TimeSpan.FromMilliseconds(3000); 
     dispatchTimer.Tick += dispatchTimer_Tick; 
     BackGroundThread bgT = Application.Current.Resources["BackGroundThread"] as BackGroundThread; 

     bgT.GetPercentChanged += (ss, ee) => 
     { 
      UpdatePercentage = bgT.local_percentage.ToString();    
     }; 

     bgT.GetCaseID += (ss, ee) => 
     { 
      CaseID = bgT.local_caseRef; 
     }; 

     TransList =new ObservableCollection<tblTransaction>(model); 
     TransView = GetTransCollectionView(TransList); 
     TransView.Filter = OnFilterTrans; 

     var tokenSource = new CancellationTokenSource(); 
     var token = tokenSource.Token; 

     var cancellationTokenSource = new CancellationTokenSource(); 

     dispatchTimer.Start(); 

    } 

    private void dispatchTimer_Tick(object sender, EventArgs e) 
    { 
     UpdateDataGrid(); 
    }  

    public void UpdateDataGrid() 
    {   
      foreach (tblTransaction tran in TransList) 
      { 
       if (tran.caseRefNo == CaseID) 
       { 
        tran.incValue = int.Parse(UpdatePercentage); 
        tran.IsCheck = tran.IsCheck; 
       } 
       else 
       { 
        tran.incValue = tran.incValue; 
        tran.IsCheck = tran.IsCheck; 
       } 
      } 

      TransView.Refresh();   
    } 

    bool OnFilterTrans(object item) 
    { 
     var trans = (tblTransaction)item; 
     return true;   
    } 

    public CollectionView GetTransCollectionView(ObservableCollection<tblTransaction> tranList) 
    { 
     return (CollectionView)CollectionViewSource.GetDefaultView(tranList); 
    } 
} 

这是我的观点:

<Window x:Class="EmployeeManager.View.DataGridDownload" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="DataGridDownload" Height="600" Width="790"> 
<Grid> 
    <DataGrid HorizontalAlignment="Left" ItemsSource="{Binding TransView}" AutoGenerateColumns="False" Margin="10,62,0,0" VerticalAlignment="Top" Height="497" Width="762"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="caseRefNo" Binding="{Binding caseRefNo}" /> 
      <DataGridTextColumn Header="subjMatr" Binding="{Binding subjMatr}" /> 
      <DataGridTextColumn Header="Download %" Binding="{Binding incValue}" /> 
      <DataGridTemplateColumn> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <CheckBox x:Name="TestCheckBox" IsChecked="{Binding IsCheck,Mode=TwoWay}"></CheckBox> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
    </DataGrid> 
    <Label Content="{Binding UpdatePercentage}" HorizontalAlignment="Left" Background="Blue" Foreground="White" Margin="10,10,0,0" VerticalAlignment="Top" Width="338" Height="30"> 

    </Label> 
    <Button Content="Button" HorizontalAlignment="Left" Margin="672,20,0,0" VerticalAlignment="Top" Width="75"/> 

</Grid> 

这是我tblTransaction型号

public class tblTransaction 
{ 
    public string caseRefNo { get;set;} 
    public string subjMatr { get; set; } 
    public int incValue { get; set; } 
    public DateTime? longTime { get; set; } 

    private bool _ischk = false; 
    public bool IsCheck { 
     get { return _ischk ;} 
     set { _ischk = value; } 
    } 
} 

请指导我该怎么做。任何帮助真的很感激。 df

+0

我最好的猜测是,你正在创建从GetTransCollectionView每次一个全新的CollectionView。您的数据绑定不断更新CollectionView中的值,而不是您的TransList。只需在IsCheck设置程序中放置一个断点并查看堆栈跟踪即可。 – cscmh99

回答

1

我更改了我的模型和xaml文件,如下所示。它现在正在工作。

DataGrid中

<DataGridTemplateColumn> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <CheckBox 
          Content="Please Select" IsChecked="{Binding Path=IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">         
         </CheckBox> 
        </DataTemplate>       
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 

在tblTransaction型号

public class tblTransaction 
{ 
    public string caseRefNo { get;set;} 
    public string subjMatr { get; set; } 
    public int incValue { get; set; } 
    public DateTime? longTime { get; set; } 

    public bool IsSelected { get; set; } 
} 

感谢