繁体   English   中英

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

[英]Datagrid checkbox selection lost when refresh datagrid WPF MVVM

我有用caseRefNo,subjrMatr填充的数据网格,在其中下载数据。 我的backgroundworker正在运行,并返回caseRefNo和Download百分比。 我使用DispatcherTimer根据caseRefNo更新下载百分比(每3秒)。

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

在此处输入图片说明

这是我的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

我如下更改了我的模型和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; }
}

谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM