2015-09-24 3 views
0

У меня есть datagrid, который заполнен caseRefNo, subjrMatr, Загружает данные в нем. мой рабочий стол работает и возвращает caseRefNo и Download percent. I user DispatcherTimer, чтобы обновить процент загрузки (каждые 3 секунды) в соответствии с caseRefNo.Datagrid checkbox selection утерян при обновлении datagrid WPF MVVM

Я могу показать процент загрузки в datagrid, отфильтрованный caseRefNo. Проблема начинается здесь. я не могу проверить свой флажок, потому что DispatcherTimer обновляет CollectionView, который я привязываю к datagrid.

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

Мое предположение, что вы создаете новый CollectionView от GetTransCollectionView каждый раз. Связывание данных обновляет значение в 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; } 
} 

благодаря

Смежные вопросы