Behavior of IMultiValueConverter

本文关键字:IMultiValueConverter of Behavior | 更新日期: 2023-09-27 18:01:28

我有一个带有样式模板的DevExpress GridControl,它有一个转换器,提供单元格的背景刷属性,但它不能正常工作。

在我的GridControl中,我想显示客户是否参加了研讨会,所以我有一个客户列,根据所选的月份,有28到31列,其中包含checkkedits,如果在该日期有研讨会,转换器返回蓝色画笔,如果没有研讨会,则返回白色画笔。

选择一个月后GridControl的更新源和只包含客户想参加一个研讨会在这个月,但是当我开始调试转换方法我还看到它检查客户,不应该在源集合了我绝对确定的转换方法被调用后更新源集合,因为我触发转换方法,通过让每一列标题,然后重置头。

奇怪的是,这有时有效,但不是每次都有效。

<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,但这比仅仅更新源集合要慢。

Behavior of IMultiValueConverter

没有看到转换器的代码很难说,但我倾向于摆脱不必要的MultiBinding并简化为:

<Setter Property="Background" Value="{Binding Path=Column.Header, Converter={converter:CellColorConverterAmended} }" />
相关文章:
  • 没有找到相关文章