1

我有一个使用 Telerik 的 Silverlight 5 项目RadGridView。这RadGridViewRowDetails,其中包含可编辑TextBox的。如果我在TextBox其中多次粘贴一些文本直到达到MaxLength,则所选网格行中的第一列会自动使用多余的文本进行编辑。有没有人看到并修复了这个?

试试看,这里有一些 sode:

XAML

<telerik:RadGridView Name="gvMain" AutoGenerateColumns="False">
    <telerik:RadGridView.ChildTableDefinitions>
    <telerik:GridViewTableDefinition />
</telerik:RadGridView.ChildTableDefinitions>

<telerik:RadGridView.Columns>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding Title}" />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding PageCount}" />
</telerik:RadGridView.Columns>

<telerik:RadGridView.HierarchyChildTemplate>
    <DataTemplate>
       <StackPanel Orientation="Horizontal">
           <TextBlock>Name</TextBlock>
           <TextBox Text="{Binding DataContext.Author.Name, RelativeSource={RelativeSource FindAncestor, AncestorType=StackPanel}}" 
                    MaxLength="20" Width="100" />
       </StackPanel>
    </DataTemplate>
</telerik:RadGridView.HierarchyChildTemplate>

楷模

public class Author
{
   public string Name { get; set; }
   public string LastName { get; set; }
}

public class Book
{
   public string Title { get; set; }
   public int PageCount { get; set; }
   public Author Author { get; set; }
}

背后的代码

this.gvMain.ItemsSource = new List<Models.Book>()
  {
     new Book(){ Author = new Author(){ Name = "John", LastName = "Smith"}, 
                 Title = "Dummy", PageCount = 100}
  }; 
4

1 回答 1

0

似乎当TextBoxComboBox在 RowDetails 中无法粘贴剪贴板中的文本时(MaxLength例如到达时),它们停止处理中继到行本身的粘贴事件。Ard 所以行插入粘贴的文本。

我们实施的解决方案是用只有这个附加代码的自定义文本框替换文本框:

protected override void OnKeyDown(KeyEventArgs e)
 {
     if (IsPastingAndClipboardTextIsTooLarge(e.Key))
     {
        int textToFit = (MaxLength - Text.Length + SelectionLength);
        if (textToFit > 0)
        {
           var startIndex = SelectionStart;
           var textToPaste = Clipboard.GetText().Substring(0, Math.Min(textToFit, Clipboard.GetText().Length));
           int caretPosition = startIndex + textToPaste.Length;
           if (SelectionLength > 0)
              Text = Text.Remove(startIndex, SelectionLength);

           Text = Text.Insert(startIndex, textToPaste);
           SelectionStart = caretPosition;
        }

        e.Handled = true;
     }
     else base.OnKeyDown(e);
  }

  public bool IsPastingAndClipboardTextIsTooLarge(Key key)
  {
     return key == Key.V && ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control) &&
            Clipboard.ContainsText() &&
            Text.Length + Clipboard.GetText().Length > MaxLength - SelectionLength;
  } 

ComboBoxes也需要一些代码。如果有更好的解决方案请告诉我!

于 2013-04-25T10:21:35.023 回答