DataGrid のテキストボックスに無効なデータが含まれていて無効になっている場合、WPF のバグに遭遇したと思います。
テキストボックスに無効なデータが含まれていて無効になっている場合、無効なデータを含むテキストボックスを2回クリックし、行の別の要素をクリックしてから、無効なデータを含むテキストボックスを2回クリックすることで、魔法のようにデータ(およびバインディング?)を消すことができます。問題を再現する小さな例を作成しました。121 を 2 回、55 を 1 回、121 を 2 回クリックすると、121 が消えます (バインドが機能しなくなりますか?)。誰かがそれがバグであることを確認できますか、それとも私は愚かなことをしていますか?
WPF コード:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<DataGrid ItemsSource="{Binding Path=Tests}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Test header">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox IsEnabled="False" Text="{Binding Path=Text, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}">
</TextBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Test header 2">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox IsEnabled="False" Text="{Binding Path=Text2, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}">
</TextBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
C# コード:
using System;
using System.Windows;
using System.ComponentModel;
using System.Collections.ObjectModel;
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public ObservableCollection<Test> Tests {get;set;}
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
Tests = new ObservableCollection<Test>();
Tests.Add(new Test());
}
}
public class Test : INotifyPropertyChanged, IDataErrorInfo
{
public string Text { get; set; }
public string Text2 { get; set; }
public Test()
{
Text = "121";
Text2 = "55";
}
public string Error
{
get { return null; }
}
public string this[string columnName]
{
get { return "WTF!!!"; }
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
}