1

DataGridユーザーが新しいレコードを入力できるようにするために使用しようとしていました。はItemsSourceにバインドされていObservableCollection<MyObject>ます。検証とUIへの通知のためにMyObject実装されます。IDataErrorInfoINotifyPropertyChangedPropertyChanged

質問:

次の問題をどのように乗り越えることができますか?

問題:

編集モードで、長いエラー文字列をセルに入力すると、エラー インジケーター (赤い境界線) が の周りに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は非常に面倒です。以下は、この問題を解決するために私が行った手順です。

  1. この問題ValidationErrorTemplateのを削除しました。

  2. 明示的に定義されElementStyleEditingElementStyle個別に設定さMode=TwoWayElementStyle別の問題に対応します。

  3. 現在のセルにエラーがある場合にユーザーが他のセルを編集できるようにするために、ValidatesOnDataErrors=Trueから削除されました。ElementStyle

  4. セルの値が空のセルのエラー インジケーターを表示する場合MultiDataTriggerに を設定するように定義されています。BorderBrushRedNull

おそらくItemsControl代わりに を使用しますが、 の組み込み機能のいくつかは気に入っていますDataGrid

4

0 に答える 0