0

セルの背景ブラシ プロパティを提供するコンバーターを持つスタイル テンプレートを持つ DevExpress GridControl がありますが、正しく動作しません。

私のGridControlでは、顧客がセミナーに参加したかどうかを表示したいので、顧客用の列があり、選択した月に応じて、チェックされた28から31の列があり、セミナーがある場合、コンバーターは青いブラシを返しますその日に、またはセミナーがない場合は白いブラシ。

月を選択すると、GridControl のソースが更新され、その特定の月にセミナーに参加したい顧客のみが含まれますが、convert メソッドでデバッグを開始すると、ソース コレクションに含まれていない顧客もチェックされることがわかります。各列に新しいヘッダーを与えてからヘッダーをリセットすることで convert メソッドをトリガーするため、ソースコレクションを更新した後に convert メソッドが呼び出されることは間違いありません。

奇妙なことに、これは時々機能しますが、毎回ではありません。

<dxg:GridControl x:Name="seminarGrid" ItemsSource="{Binding CustomerList}">
    <dxg:GridControl.Resources>
        <Style x:Key="customCellStyle" 
               BasedOn="{StaticResource {dxgt:GridRowThemeKey ResourceKey=CellStyle}}"
               TargetType="grid:CellContentPresenter">
            <Setter Property="Background">
                <Setter.Value>
                    <MultiBinding Converter="{converter:CellColorConverter}">
                        <Binding />
                        <Binding Path="Column.Header" />
                    </MultiBinding>
                </Setter.Value>
            </Setter>
        </Style>
     </dxg:GridControl.Resources>
     <dxg:GridControl.Columns>
         <dxg:GridColumn FieldName="Customer" Header="Customer" AllowEditing="False"/>
         <dxg:GridColumn x:Name="d0" FieldName="d0" Header="1." Width="27" 
                         CellStyle="{StaticResource customCellStyle}" 
                         EditSettings="{dxe:CheckSettings}"/>
         <dxg:GridColumn x:Name="d1" FieldName="d1" Header="2." Width="27" 
                         CellStyle="{StaticResource customCellStyle}" 
                         EditSettings="{dxe:CheckSettings}"/>
         [...]
         <dxg:GridColumn x:Name="d30" FieldName="d30" Header="2." Width="27" 
                         CellStyle="{StaticResource customCellStyle}" 
                         EditSettings="{dxe:CheckSettings}"/>
    </dxg:GridControl.Columns>
</dxg:GridControl>

変換方法:

public object Convert(object[] value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value[1].ToString().Equals(string.Empty))
            return Brushes.White;

        var cellData = value[0] as EditGridCellData;
        var customer = cellData.RowData.Row as Customer;

        if (customer == null)
            return Brushes.White;

        var date = int.Parse(value[1].ToString().Split('.')[0], NumberStyles.Integer);
        var result = Brushes.BlueViolet;
        var viewTag = cellData.View.Tag is int
                          ? int.Parse(cellData.View.Tag.ToString(), NumberStyles.Integer)
                          : 0;
        var elements = customer.BookingRelation.Where(p => p.Value.Datum.Day == date && p.Value.Datum.Month == viewTag);


        if (elements.Count() == 1)
            result = Brushes.CornflowerBlue;


        return customer.BookingRelation.Any(item => item.Value.Date.Day == date && item.Value.Date.Month == viewTag) ? result : Brushes.White;
    }

どうすればこの問題を解決できますか? 私が考えることができる唯一の解決策は、ユーザーが月を選択するたびに分離コードで GridControl を生成することですが、それはソース コレクションを更新するよりも遅くなります...

4

1 に答える 1

1

コンバーターのコードを見ずに言うのは難しいですが、不要なMultiBindingを取り除き、次のように単純化する傾向があります。

<Setter Property="Background" Value="{Binding Path=Column.Header, Converter={converter:CellColorConverterAmended} }" />
于 2013-02-28T14:18:16.830 に答える