DataGrid
ユーザーが新しいレコードを入力できるようにするために使用しようとしていました。はItemsSource
にバインドされていObservableCollection<MyObject>
ます。検証とUIへの通知のためにMyObject
実装されます。IDataErrorInfo
INotifyPropertyChanged
PropertyChanged
質問:
次の問題をどのように乗り越えることができますか?
問題:
編集モードで、長いエラー文字列をセルに入力すると、エラー インジケーター (赤い境界線) が の周りにTextBox
表示されますが、セルを離れると、次のようにインジケーターがオーバーランして他の列を覆います。
XAML:
<DataGrid VerticalAlignment="Top" Margin="0,5" CanUserAddRows="True" AutoGenerateColumns="False" ItemsSource="{Binding Pricelist}" >
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Validation.ErrorTemplate" Value="{x:Null}"/>
</Style>
</DataGrid.CellStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="Price" Width="60" >
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="Text" Value="{Binding Price, Mode=TwoWay}"/>
</Style>
</DataGridTextColumn.ElementStyle>
<DataGridTextColumn.EditingElementStyle>
<Style TargetType="TextBox">
<Setter Property="Text" Value="{Binding Price, ValidatesOnDataErrors=True}"/>
</Style>
</DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
ノート:
これらはすべて非常に典型的なものであり、簡単なはずですが、私の経験でDataGrid
は非常に面倒です。以下は、この問題を解決するために私が行った手順です。
この問題
ValidationErrorTemplate
のを削除しました。明示的に定義され
ElementStyle
、EditingElementStyle
個別に設定さMode=TwoWay
れElementStyle
、別の問題に対応します。現在のセルにエラーがある場合にユーザーが他のセルを編集できるようにするために、
ValidatesOnDataErrors=True
から削除されました。ElementStyle
セルの値が空のセルのエラー インジケーターを表示する場合
MultiDataTrigger
に を設定するように定義されています。BorderBrush
Red
Null
おそらくItemsControl
代わりに を使用しますが、 の組み込み機能のいくつかは気に入っていますDataGrid
。