DevExpress のサポート センターを検索しても、この問題の解決に役立つ情報は見つかりませんでした。しかし、この素敵なアプリケーション (Snoop)のおかげで解決できました。
問題は、DevExpress のグリッド コレクションが他の WPF の標準コレクションのように動作しないことです。任意の WPF のコレクションでは、各行 (またはコレクション内の項目) がDataContext
ViewModel (またはコレクション型の任意のクラス) にあります。DevExpress のグリッドはそのようには機能しません...
GridRow
DevExpress のグリッドの各項目には、タイプRowData
のオブジェクトがDataContext
あり、各セル (タイプはGridCellContentPresenter
) にはタイプのオブジェクトがありますEditGridCellData
。ご覧のとおり、このオブジェクトはコレクションと同じタイプではありません。
では、ビュー モデルとグリッド内のビュー行またはセル項目との間で双方向バインディングを行うにはどうすればよいでしょうか?
行テンプレートを作成する場合:
DataContext
各行の にあるオブジェクトのタイプはRowData
です。この型には という名前のDataContext
プロパティがあり、このプロパティはRowTypeDescriptor
(コレクション型のラッパーのような) 型です。これは、バインディングの作成には機能しません。しかし、型には、コレクションの型行オブジェクトを見つけることができるプロパティ namdeがあるため、必要なことは、このプロパティへのバインディングを作成することだけです。たとえば、この場合、bool フィールドが true に設定されている場合に行を横切るようにします。RowData
Row
<DataTemplate x:Key="myRowTemplate">
<Grid>
<dx:MeasurePixelSnapper>
<ContentPresenter x:Name="defaultRowPresenter" Content="{Binding}" ContentTemplate="{Binding View.DefaultDataRowTemplate}" />
</dx:MeasurePixelSnapper>
<Path Data="M5.496,10.5 L508,10.5" Fill="#FFF" HorizontalAlignment="Stretch" Height="1" Stretch="Fill" Stroke="#FF040404" VerticalAlignment="Center" Width="Auto" Margin="0" Visibility="{Binding Row.AnyModelBoolProperty, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource IntToVisibilityConverter}}"/>
</Grid>
</DataTemplate>
セル テンプレートを作成する場合:
この場合は、もう少し複雑です。オブジェクトEditGridCellData
には、コレクションのオブジェクト タイプを見つけることができるプロパティがないためです。ここで見つけることがData
できるのは、タイプ のオブジェクトを見つけることができるというプロパティだけRowTypeDescriptor
なので、うまく動作しません。先祖型バインディングを使用してこれを解決する必要があります。次の例を参照してください。
<dxg:GridColumn x:Name="dateRow" FieldName="Date" Header="Date">
<dxg:GridColumn.CellTemplate>
<DataTemplate>
<dxe:DateEdit x:Name="PART_Editor" DateTime="{Binding DataContext.Row.Date, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource AncestorType={x:Type dx:StackVisibleIndexPanel}}}" IsEnabled="{Binding DataContext.Row.DateEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource AncestorType={x:Type dx:StackVisibleIndexPanel}}}" MinValue="{Binding DataContext.Row.DateMinValue, RelativeSource={RelativeSource AncestorType={x:Type dx:StackVisibleIndexPanel}}}"/>
</DataTemplate>
</dxg:GridColumn.CellTemplate>
</dxg:GridColumn>
ここには、モデルにバインドされ、正しく通知される日付コントロールがあります。これが、この問題を抱えているすべての人にとって役立つことを願っています。本当の頭痛です。