刷新datagrid WPF MVVM时,Datagrid复选框选择丢失

时间:2015-09-24 02:27:30

标签: c# wpf mvvm datagrid

我有填充了caseRefNo,subjrMatr,下载数据的datagrid。我的后台工作正在运行并返回caseRefNo和下载百分比。我根据caseRefNo使用DispatcherTimer更新下载百分比(每3秒)。

我可以在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

1 个答案:

答案 0 :(得分: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; }
}

感谢