内容が無効な値のValidatesOnDataErrors=True
場合DataGridTextColumn
、プログラムで値を変更すると、変更された値が表示されますが、列をクリックする (編集モードに入る) まで、値は無効な値に戻ります... 以下は作業サンプル:
XAML:
<Window x:Class="WpfApplication1.Window13"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window13" Height="300" Width="300">
<Grid>
<DataGrid VerticalAlignment="Top" Margin="0,5" CanUserAddRows="True" AutoGenerateColumns="False" VerticalScrollBarVisibility="Auto" ItemsSource="{Binding Pricelist}" CanUserDeleteRows="True" >
<DataGrid.Columns>
<DataGridTextColumn Header="Price" Width="60" Binding="{Binding Price, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"/>
</DataGrid.Columns>
</DataGrid>
<Button Content="Correct" Height="23" HorizontalAlignment="Left" Margin="191,226,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
</Grid>
分離コード:
using System;
using System.Windows;
using System.Collections.ObjectModel;
using System.ComponentModel;
namespace WpfApplication1
{
public partial class Window13 : Window
{
public Window13()
{
InitializeComponent();
Pricelist = new ObservableCollection<MyProduct>();
this.DataContext = this;
}
public ObservableCollection<MyProduct> Pricelist { get; set; }
private void button1_Click(object sender, RoutedEventArgs e)
{
foreach(var p in Pricelist)
{
p.Price = "0";
}
}
}
public class MyProduct:INotifyPropertyChanged,IDataErrorInfo
{
private string _price;
public string Price
{
get
{
return _price;
}
set
{
_price = value;
this.RaisePropertyChanged("Price");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
{
var handler = this.PropertyChanged;
if (handler != null)
{
handler(this, e);
}
}
protected void RaisePropertyChanged(String propertyName)
{
OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
}
public string Error
{
get
{
return this["Price"];
}
}
public string this[string columnName]
{
get
{
string result = string.Empty;
switch (columnName)
{
case "Price":
{
decimal temdecimal = 0.00m;
if (string.IsNullOrEmpty(Price) || string.IsNullOrWhiteSpace(Price)
|| !decimal.TryParse(Price, out temdecimal))
{
result = "Price is invalid";
}
break;
}
default:
{
break;
}
}
return result;
}
}
}
}
再現:
例: フィールド
"ADS"
に対して無効な列に入力し、それを使用するように変更すると、列に表示 されますが、セルをクリックして編集モードに入るとすぐに、値は再びに戻ります.number
"1"
button
1
ADS
現在の回避策:
明確にするために、現在の回避策は、次のものを削除ValidatesOnDataErrors=True
することDataGridTextColumn.EditingElementStyle
です。
<DataGridTextColumn Header="Price" Width="60">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="Text" Value="{Binding Price,UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"/>
</Style>
</DataGridTextColumn.ElementStyle>
<DataGridTextColumn.EditingElementStyle>
<Style TargetType="TextBox">
<Setter Property="Text" Value="{Binding Price,UpdateSourceTrigger=PropertyChanged}"/>
</Style>
</DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>