我有一个带有样式模板的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>convert方法:
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,但这比仅仅更新源代码集合要慢……
发布于 2013-02-28 22:18:17
如果不看转换器的代码就很难说,但我倾向于去掉不必要的MultiBinding,并简化为:
<Setter Property="Background" Value="{Binding Path=Column.Header, Converter={converter:CellColorConverterAmended} }" />https://stackoverflow.com/questions/15133821
复制相似问题