WPF DataGridTextColumn包含退格炭
如何 “BS”(别名退格,别名\ b)采用一个数据绑定到一个DataGridTextColumn字符串属性的值:WPF 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应用程序,有点重新创建这种情况。 我可以通过从文本编辑器复制并将其粘贴到活动数据网格单元格中,获得一个控制字符,如退格键(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;
}
}
}
感谢您的示例。我很确定产生该问题的用户不知道控制字符。我会试着用一些日志来追踪这件事情,看看它是如何发生的......非常感谢 – user3559014
“没有什么是一个足够天才的傻瓜的万无一失 - 墨菲定律 –
您可以轻松地粘贴控制字符来自剪贴板。用户可能已经复制了包含退格控制字符的字符串。这可能是文本源应用程序中的错误或用户的漏洞攻击。 – dymanoid
我亲自认识用户 - 很确定她只是简单地输入了一个字母(这是类别字符串的常规用途)......但是无论如何,我会试着用一些日志来追踪这个信息,看看它是否会再次发生。 – user3559014