2

DevExpress を使用し、mvvm パターンも使用して WPF アプリケーションに取り組んでおり、次の問題があります。

  • ブール値のプロパティ (IsChecked など) を持つビュー モデルがあります。
  • 上記のビュー モデル アイテムのコレクションにバインドされている devexpress データ グリッドであるビューがあります。
  • その devexpress データ グリッドの行はチェック ボックス タイプであり、IsChecked プロパティにバインドされています。
  • IsChecked が true の場合、行に線を表示するための devexpress グリッドの行のデータ テンプレートがあります。

データグリッドのチェックボックス列をチェック/チェック解除すると、これはすべて正常に機能します....問題は、モデルプロパティの値を変更したときです.ビューは変更されません....

モデルは を実装しINotifyPropertyChangedます。

DevExpress はアイテムごとにラッパーを作成し、モデルのプロパティが変更されたときにビューに通知しないようです。

4

1 に答える 1

5

DevExpress のサポート センターを検索しても、この問題の解決に役立つ情報は見つかりませんでした。しかし、この素敵なアプリケーション (Snoop)のおかげで解決できました。

問題は、DevExpress のグリッド コレクションが他の WPF の標準コレクションのように動作しないことです。任意の WPF のコレクションでは、各行 (またはコレクション内の項目) がDataContextViewModel (またはコレクション型の任意のクラス) にあります。DevExpress のグリッドはそのようには機能しません...

GridRowDevExpress のグリッドの各項目には、タイプRowDataのオブジェクトがDataContextあり、各セル (タイプはGridCellContentPresenter) にはタイプのオブジェクトがありますEditGridCellData。ご覧のとおり、このオブジェクトはコレクションと同じタイプではありません。

では、ビュー モデルとグリッド内のビュー行またはセル項目との間で双方向バインディングを行うにはどうすればよいでしょうか?

行テンプレートを作成する場合:

DataContext各行の にあるオブジェクトのタイプはRowDataです。この型には という名前のDataContextプロパティがあり、このプロパティはRowTypeDescriptor(コレクション型のラッパーのような) 型です。これは、バインディングの作成には機能しません。しかし、型には、コレクションの型行オブジェクトを見つけることができるプロパティ namdeがあるため、必要なことは、このプロパティへのバインディングを作成することだけです。たとえば、この場合、bool フィールドが true に設定されている場合に行を横切るようにします。RowDataRow

<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>

ここには、モデルにバインドされ、正しく通知される日付コントロールがあります。これが、この問題を抱えているすべての人にとって役立つことを願っています。本当の頭痛です。

于 2013-01-23T18:29:21.907 に答える