WPF DataGridTextColumn содержит символ возврата на одну позицию
Как "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] в качестве значения категории. Гарантируется, что никакой другой код не внесет изменения в свойство на пути к базе данных. Не удалось воссоздать ситуацию во время отладки, потому что я не знаю, как печатать [BS] в TextBox, очевидно. Только один клиент мог сделать это как-то...
У вас есть идеи, как это могло произойти? Я пытался реализовать проверку в настройщике свойств, но я пытаюсь выяснить реальную проблему здесь.
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;
}
}
}