有关 Silverlight sdk 和子输入 C# 中的数据网格控件的问题
本文关键字:数据 数据网 网格 问题 控件 sdk Silverlight 输入 有关 | 更新日期: 2023-09-27 18:32:59
我正在使用DataGrid控件编写一个Silverlight 5 Web应用程序。我确实有一个有趣的问题。
我为每一行使用模板化列。每行表示可观察集合中的一个数据项。
每行包含一个复选框、一个文本块和一个文本框。
我的错误发生的环境是行数多于银光可以在屏幕上绘制的环境,从而启用垂直折叠条。
当用户将信息输入多个文本框和/或多个复选框时,将选中向下滚动随机框,并使用先前填充的文本框中的相似/部分输入填充随机文本框。
当用户向上滚动然后向下滚动时,将随机填充不同的行。我已经尝试过绑定和未绑定输入,结果是一样的。
我模拟了一个显示此问题的示例
这是 MainPage.xaml 的 XAML
<UserControl x:Class="DataGrid_bug_repro.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit"
mc:Ignorable="d"
d:DesignHeight="600" d:DesignWidth="800">
<Grid x:Name="LayoutRoot" Background="White">
<StackPanel>
<TextBlock Margin="60 0 0 0">Bound to Data Items</TextBlock>
<sdk:DataGrid Name="dgBound" Height="280" Width="680" AutoGenerateColumns="False" FontSize="12" >
<sdk:DataGrid.Columns>
<sdk:DataGridTemplateColumn Header="Select" >
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel>
<CheckBox Width="40" Tag="{Binding ID}" IsChecked="{Binding Selected}" />
</StackPanel>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn Header="name" >
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel>
<Grid>
<TextBlock TextWrapping="Wrap" Text="{Binding Name}" TextOptions.TextFormattingMode="Ideal" />
</Grid>
</StackPanel>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn Header="txt" >
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel>
<Grid>
<TextBox Text="{Binding txt}" />
</Grid>
</StackPanel>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
</sdk:DataGrid.Columns>
</sdk:DataGrid>
<TextBlock Margin="60 0 0 0">Not Bound to Data Items</TextBlock>
<sdk:DataGrid Name="dgNotBound" Height="280" Width="680" AutoGenerateColumns="False" FontSize="12" >
<sdk:DataGrid.Columns>
<sdk:DataGridTemplateColumn Header="Select" >
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel>
<CheckBox Width="40" Tag="{Binding ID}" />
</StackPanel>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn Header="name" >
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel>
<Grid>
<TextBlock TextWrapping="Wrap" Text="{Binding Name}" TextOptions.TextFormattingMode="Ideal" />
</Grid>
</StackPanel>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn Header="txt" >
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel>
<Grid>
<TextBox Text="" />
</Grid>
</StackPanel>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
</sdk:DataGrid.Columns>
</sdk:DataGrid>
</StackPanel>
</Grid>
</UserControl>
下面是 MainPage.xaml.cs 文件的 C# 代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.ComponentModel;
using System.Collections.ObjectModel;
namespace DataGrid_bug_repro
{
public class ITEM : INotifyPropertyChanged
{
private string _ID = string.Empty;
private bool _Selected = false;
private string _Name = string.Empty;
private string _txt = string.Empty;
public string ID
{
get{return _ID;}
set { _ID = value; onPropertyChanged(this, "ID"); }
}
public string Name
{
get { return _Name; }
set { _Name = value; onPropertyChanged(this, "Name"); }
}
public string txt
{
get { return _txt; }
set { _txt = value; onPropertyChanged(this, "txt"); }
}
public bool Selected
{
get { return _Selected; }
set { _Selected = value; onPropertyChanged(this, "Selected"); }
}
public event PropertyChangedEventHandler PropertyChanged;
private void onPropertyChanged(object sender, string propertyName)
{
if (this.PropertyChanged != null)
{
PropertyChanged(sender, new PropertyChangedEventArgs(propertyName));
}
}
}
public partial class MainPage : UserControl
{
public MainPage()
{
ObservableCollection<ITEM> Items = new ObservableCollection<ITEM> {
new ITEM { ID="1", Name="Gomez" },
new ITEM { ID="2", Name="Morticia" },
new ITEM { ID="3", Name="Pugsly" },
new ITEM { ID="4", Name="Wednesday" },
new ITEM { ID="5", Name="Pubert" },
new ITEM { ID="6", Name="Uncle Fester" },
new ITEM { ID="7", Name="Grandmama" },
new ITEM { ID="8", Name="Thing" },
new ITEM { ID="9", Name="Lurch" },
new ITEM { ID="10", Name="Cousin Itt" },
new ITEM { ID="11", Name="Cousin Cackle" },
new ITEM { ID="12", Name="Kitty Cat" },
new ITEM { ID="13", Name="Aristotle" },
new ITEM { ID="14", Name="Homer" },
new ITEM { ID="15", Name="Tristan" },
new ITEM { ID="16", Name="Isolde" },
new ITEM { ID="17", Name="Zelda" },
new ITEM { ID="18", Name="Cleopatra" },
new ITEM { ID="19", Name="Bernice" },
new ITEM { ID="20", Name="Ophelia" },
new ITEM { ID="21", Name="Melancholia" },
new ITEM { ID="22", Name="Hester" },
new ITEM { ID="23", Name="Norman Normanmeyers" },
new ITEM { ID="24", Name="Normina Normanmeyers" },
new ITEM { ID="25", Name="N.J. Normanmeyers" } };
InitializeComponent();
dgBound.ItemsSource = Items;
dgNotBound.ItemsSource = Items;
}
}
}
以前有人见过这个吗? 有解决方法吗?我错过了一些明显的东西吗?
提前致谢:)
我过去也遇到过这个问题,我不记得如何解决它。但是,查看代码可能是这样:
尝试在代码后面为 IsKeyboardFocusWithinChanged 添加一个事件处理程序,如下所示,
private void DataGrid_IsKeyboardFocusWithinChanged(object sender, System.Windows.DependencyPropertyChangedEventArgs e)
{
(sender as DataGrid).CommitEdit(DataGridEditingUnit.Row, true);
}
如果这不起作用,我将删除我的答案。
事实证明,利用双向绑定模式实际上使此问题无效。我不确定为什么,但这可能与行可视化有关。我只是想让你们都知道解决方法。