【问题标题】:WPF Toolkit DataGrid Checkbox IssuesWPF 工具包 DataGrid 复选框问题
【发布时间】:2011-03-30 16:24:15
【问题描述】:

我真的希望有人可以在这里帮助我。我的程序中有一个 DataGrid,它有一个复选框列。 DataGrid 的 ItemsSource 是以编程方式加载的 DataSet。当我在 DataGrid 中选择几个项目然后滚动它时,我得到了一些非常奇怪的行为。例如,当我检查两个复选框时,它告诉我“选择了 2”,但是如果我在 DataGrid 中向上或向下滚动,数字会发生变化。如果我滚动回初始位置,它会回到“2 selected”。听起来很奇怪,当我滚动框时,它似乎在调用 Checked/Unchecked 事件......非常奇怪......

我在代码顶部定义了以下内容:

private DataSet MyDataSet;
int selected_count = 0;

然后我的方法中有以下代码将信息加载到数据集中:

MyDataSet = new DataSet();
DataTable tempDataTable = new DataTable();
MyDataSet.Tables.Add(tempDataTable);

DataColumn tempCol = new DataColumn("Checked", typeof(bool));
tempDataTable.Columns.Add(tempCol);

for (int i = 0; i < 50; i++)
{
    DataRow tempRow = tempDataTable.NewRow();
    tempDataTable.Rows.Add(tempRow);
    tempRow["Checked"] = false;
}

MyList.ItemsSource = MyDataSet.Tables[0].DefaultView;

我使用以下 XAML 将 IsChecked 属性绑定到名为“Checked”的 DataColumn:

<dtgrd:DataGrid x:Name="MyList" AutoGenerateColumns="False" CanUserAddRows="False" CanUserResizeRows="False" HeadersVisibility="Column" SelectionUnit="FullRow" HorizontalGridLinesBrush="#FF688CAF" VerticalGridLinesBrush="#FF688CAF">
    <dtgrd:DataGrid.Columns>
        <dtgrd:DataGridTemplateColumn x:Name="CheckCol" CanUserSort="True" CanUserResize="False">
            <dtgrd:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <CheckBox Name="MyCheckBox" IsChecked="{Binding Checked}" HorizontalAlignment="Center" VerticalAlignment="Center" Checked="MyCheckBox_Checked" Unchecked="MyCheckBox_Unchecked" />
                </DataTemplate>
            </dtgrd:DataGridTemplateColumn.CellTemplate>
        </dtgrd:DataGridTemplateColumn>
    </dtgrd:DataGrid.Columns>
</dtgrd:DataGrid>

然后,我通过选中/取消选中其中一个复选框来调用以下事件:

private void MyCheckBox_Checked(object sender, RoutedEventArgs e)
{
    selected_count++;
    TxtSelectedCount.Text = "" + selected_count + " selected";
}

private void MyCheckBox_Unchecked(object sender, RoutedEventArgs e)
{
    selected_count--;
    TxtSelectedCount.Text = "" + selected_count + " selected";
}

我也尝试过其他的东西,但得到了不同的错误。例如,我从 XAML 代码中删除了 Binding 并尝试使用以下 Checked/Uncheck 事件以编程方式设置它:

private void MyCheckBox_Checked(object sender, RoutedEventArgs e)
{
    DataRow tempRow = MyDataSet.Tables[0].Rows[MyList.Items.IndexOf(MyList.SelectedItems[0])];
    tempRow["Checked"] = true;

    selected_count++;
    TxtSelectedCount.Text = "" + selected_count + " selected";
}

private void MyCheckBox_Unchecked(object sender, RoutedEventArgs e)
{
    DataRow tempRow = MyDataSet.Tables[0].Rows[MyList.Items.IndexOf(MyList.SelectedItems[0])];
    tempRow["Checked"] = false;

    selected_count--;
    TxtSelectedCount.Text = "" + selected_count + " selected";
}

当我使用该代码时,检查项目的数量保持不变,但实际检查会在我滚动时移动到不同的项目。

老实说,我不知道发生了什么,但这非常令人沮丧!任何帮助将不胜感激!

【问题讨论】:

    标签: wpf datagrid checkbox toolkit


    【解决方案1】:

    您遇到了物品容器回收问题。见http://blogs.msdn.com/b/vinsibal/archive/2008/05/14/recycling-that-item-container.aspx。 WPF 在您滚动时重新使用行对象,并且您会看到 Checked 和 Unchecked 事件在绑定到不同的行时触发。

    如果您想坚持当前的解决方案,您可以禁用物品容器回收 通过将VirtualizingStackPanel.VirtualizationMode="Standard" 添加到您的dtgrd:DataGrid 元素。您还可以通过添加VirtualizingStackPanel.IsVirtualizing="False" 来完全禁用虚拟化。

    更好的设计可能是从底层数据模型中获取数据,而不是依赖于 UI 事件。尝试处理 DataTable 上的 DataTable.ColumnChanged 事件。

    【讨论】:

    • 就处理 DataTable.ColumnChanged 事件而言,我不确定您的意思,但第一个解决方案效果很好!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 2011-02-20
    • 2016-01-13
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 2010-12-19
    相关资源
    最近更新 更多