Ran*_*ary 2 wpf checkbox datagrid toolkit
我真的希望有人可以帮助我.我的程序中有一个DataGrid,它有一个复选框列.DataGrid的ItemsSource是以编程方式加载的DataSet.当我在DataGrid中选择几个项目然后滚动它时,我会得到一些非常奇怪的行为.例如,当我检查两个CheckBox时,它告诉我有"2选择",但是如果我在DataGrid中向上或向下滚动,则数字会改变.如果我回滚到初始位置,它会回到"2选中".虽然听起来很奇怪,但当我滚动框时,它似乎正在调用Checked/Unchecked事件...非常奇怪......
我的代码顶部定义了以下内容:
private DataSet MyDataSet;
int selected_count = 0;
Run Code Online (Sandbox Code Playgroud)
然后我在我的方法中有以下代码将信息加载到DataSet中:
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;
Run Code Online (Sandbox Code Playgroud)
我将IsChecked属性绑定到名为"Checked"的DataColumn,使用以下XAML:
<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>
Run Code Online (Sandbox Code Playgroud)
然后,我通过选中/取消选中其中一个复选框来调用以下事件:
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";
}
Run Code Online (Sandbox Code Playgroud)
我也尝试了其他的东西,但得到了不同的错误.例如,我从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";
}
Run Code Online (Sandbox Code Playgroud)
当我使用该代码时,检查项目的数量保持不变,但实际检查在我滚动时移动到不同的项目.
老实说,我不知道发生了什么,但这非常令人沮丧!任何帮助将不胜感激!
你正在进入物品容器回收.请参阅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事件.
| 归档时间: |
|
| 查看次数: |
5892 次 |
| 最近记录: |