4

2つの列を持つDataGridがあります。

  1. DataGridComboBoxColumn
  2. DataGridTextColumn。

データ検証を設定して、一方に値がある場合、もう一方にも値が含まれるまでエラーが発生するようにしました。検証はばかげていますが、検証を行うためのいくつかの簡単な基準を提供するので、この問題を説明できます。

テキストセルに何かを入力し、Tabキーを押してから最初のセルをクリックすると、最初のセルはエラー状態にあることを示します(これは正しいです)。問題は、コンボボックスのドロップダウンから何かを選択し、そのセルから移動すると(Tabキーを押すか、別のセルをクリックして)、コンボボックスに選択した値が表示されなくなることです。プロパティが変更されるたびにソースを更新するようにバインディングを設定しているので、選択するとすぐに選択した値に設定されます。しかし、セルから離れると、プロパティはnullに設定されます。セルがエラー状態でない場合、この動作は表示されません。

誰か助けてもらえますか?これが私のDataGridのXAMLです。

        <DataGrid Grid.Row="2"
              Name="GrdData"
              ItemsSource="{Binding Path=Dvm.Data}"
              SelectedItem="{Binding Path=Dvm.SelectedData, Mode=TwoWay}"
              CanUserAddRows="True"
              CanUserDeleteRows="False"
              AutoGenerateColumns="False"
              Margin="5"
              SelectionMode="Single"
              IsEnabled="{Binding Path=IsGridEnabled}">
        <DataGrid.Columns>
            <DataGridComboBoxColumn Header="Column 1"
                                    SelectedItemBinding="{Binding Path=Col1, Mode=TwoWay, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"
                                    Width="*"
                                    DisplayMemberPath="Description">
                <DataGridComboBoxColumn.ElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource" Value="{Binding Path=DropDownValues, Mode=OneWay}" />
                        <Setter Property="IsSynchronizedWithCurrentItem" Value="False"/>
                    </Style>
                </DataGridComboBoxColumn.ElementStyle>
                <DataGridComboBoxColumn.EditingElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource" Value="{Binding Path=DropDownValues, Mode=OneWay}"/>
                        <Setter Property="IsDropDownOpen" Value="True" />
                    </Style>
                </DataGridComboBoxColumn.EditingElementStyle>
            </DataGridComboBoxColumn>
            <DataGridTextColumn Header="Column 2"
                                Binding="{Binding Path=Col2, Mode=TwoWay, ValidatesOnDataErrors=True}"
                                Width="*"/>
        </DataGrid.Columns>
    </DataGrid>

私は自分が間違っていることを想像することはできません。私が抱えているのと同じ問題を説明しているように見えるこの別のリンクを見ましたが、それらのために働いた解決策は私にとってはうまくいかないようです。SelectedValueBindingとSelectedValuePathを追加しましたが、動作は変わりませんでした。

4

1 に答える 1

6

Mode=TwoWayバインディングから 取り外します。

この問題は、クリップボードと自動化サポートのバグが原因です。これは、セルに特別なプロパティを設定しClipboardContentBindingて値を読み取ることで機能します。そのバインディングが双方向の場合、古い値が特別なプロパティからビュー モデルにプッシュされることがあり、検証エラーがこの動作をトリガーするようです。 DataGridBoundColumnsandDataGridComboBoxColumnsBindingor SelectedItemBindingif ClipboardContentBindingis null を提供するため、これらのいずれかをTwoWayバインディングに設定すると、このバグが発生します。

を設定しない場合は、プロパティのデフォルトが使用されます。これはMode、特別なクリップボードプロパティ用です。 DefaultTwoWayTextBox.TextComboBox.SelectedItemOneWay

于 2014-10-15T15:40:53.880 に答える