2

内容が無効な値の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"button1ADS

現在の回避策:

明確にするために、現在の回避策は、次のものを削除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>
4

1 に答える 1