【问题标题】:WPF DataGridTextColumn contains backspace charWPF DataGridTextColumn 包含退格字符
【发布时间】:2017-07-26 12:49:46
【问题描述】:

“BS”(别名 Backspace,别名 \b)如何成为数据绑定到 DataGridTextColumn 的字符串属性中的值:

XAML

<toolkit:DataGridTextColumn Header="K" 
                            Width="40" 
                            Binding="{Binding Path=Category, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" />

C#

private string category = "";
public string Category
{
    get { return category; }
    set
    {
        category = value;
        OnPropertyChanged("Category");
    }
}

我在数据库中找到条目,然后包含 [BS] 作为类别的值。保证在访问数据库的过程中没有其他代码对属性进行更改。在调试期间无法重新创建这种情况,因为我显然不知道如何在 TextBox 中键入 [BS]。只有一位客户能以某种方式成功...

您有什么想法会发生这种情况吗? 我试图在属性设置器中实现检查,......但我试图在这里找出真正的问题。

【问题讨论】:

  • 您可以轻松地从剪贴板粘贴控制字符。用户可能复制了一个包含退格控制字符的字符串。这可能是文本源应用程序中的错误或用户的利用尝试。
  • 我亲自认识用户 - 很确定她只是输入了一个字母(这是类别字符串的常规用途)......但无论如何我会尝试用一些日志来追踪这个看看它是否会再次发生。

标签: wpf backspace datagridtextcolumn


【解决方案1】:

我创建了一个小型 WPF 应用程序,它在某种程度上重现了这种情况。 我可以通过从文本编辑器复制控制字符,例如 backspace(ASCII 8,Alt+0008),并将其粘贴到活动数据网格单元格中。 注意:确保您使用数字键盘输入 ASCII 码

MainWindow.xaml:

<Window
        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:local="clr-namespace:BackspaceInGrid"
        x:Class="BackspaceInGrid.MainWindow"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel Orientation="Vertical">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="Last Update Category Value: "/>
            <TextBlock Name="LastUpdateTextBlock"/>
        </StackPanel>
        <DataGrid x:Name="MyDataGrid" Height="300" Width="500" DataContext="" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="K" Width="40" 
                    Binding="{Binding Category, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"/>
            </DataGrid.Columns>
        </DataGrid>
    </StackPanel>
</Window>

MainWindow.xaml.cs:

using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;

namespace BackspaceInGrid
{
    public class Widget : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private string category;
        public string Category
        {
            get { return category; }
            set
            {
                category = value;
                OnPropertyChanged("Category");
            }
        }

        protected void OnPropertyChanged( string name )
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if ( handler != null )
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
    }

    public partial class MainWindow : Window
    {
        public void CategoryChangedEvent( object sender, PropertyChangedEventArgs e )
        {
            Widget widget = ( Widget ) sender;
            string categoryChars = string.Empty;
            for ( int i = 0; i < widget.Category.Length; i++ )
            {
                char c = widget.Category[i];
                if ( char.IsControl(c) )
                {
                    categoryChars = string.Format( "{0}char {1} = ASCII({2}), ", categoryChars, i, (int) c );
                }
                else
                {
                    categoryChars = string.Format( "{0}char {1} = '{2}', ", categoryChars, i, c );
                }
            }
            LastUpdateTextBlock.Text = categoryChars;
        }

        public MainWindow()
        {
            InitializeComponent();
            ObservableCollection< Widget > widgets = new ObservableCollection<Widget>();
            widgets.Add( new Widget { Category = "ABC" } );

            char [] chars_abc = new char [] { (char) 97, (char) 98, (char) 99 };
            char [] chars_ab_back_c = new char [] { (char) 97, (char) 98, (char) 8, (char) 99 };

            widgets.Add( new Widget { Category = new string(chars_abc) } );
            widgets.Add( new Widget { Category = new string(chars_ab_back_c) } );

            foreach ( Widget widget in widgets )
            {
                widget.PropertyChanged += CategoryChangedEvent;
            }
            MyDataGrid.ItemsSource = widgets;
        }
    }
}

【讨论】:

  • 感谢您的样品。我很确定产生问题的用户不知道控制字符。我会尝试用一些日志来追踪它,看看它是如何发生的......非常感谢
  • “对于一个足够有才华的傻瓜来说,没有什么是万无一失的” - 墨菲定律
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多