Your Privacy Matters: We use our own and third-party cookies to improve your experience on our website. By continuing to use the website we understand that you accept their use. Cookie Policy
275
Cannot apply cellValuePresenter/TypeConverter to XamDataGrid cells
posted

My goal is to present a table of structured data and the text of each cell can have multiple colors. I have a typeconverter which will convert the data stored in a custom class to a label or textblock containing several text elements with different colors. The data is provided in a datatable (any method that works will be fine) and each value is correctly applied to a cell. The problem is that instead of using my TypeConverter it uses the ToString method, I override that so I know the model contains the correct data. Also the ControlTemplate properties that I'm using are not applied, which tells me the ControlTemplate is not being used.

My main problem is it may not be possible to have text where different letters have different colors in a datagrid. If so, is there another way that can be done while still having a good user experience (which is hard with a grid).

As I understand it my code should define a custom CellValuePresenter, can you please help me to apply it?

I'm posting my relevant code here. Most of it is obfuscated so please don't focus on spelling errors.

View:

<Window x:Class="ViewName"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:LocalNamespace"
xmlns:ViewModel="clr-namespace:LocalNamespace.ViewModel"
xmlns:model="clr-namespace:LocalNamespace.Model"
xmlns:igDP="http://infragistics.com/DataPresenter"
>
<Window.Resources>
<local:Converter x:Key="converter" />
<ViewModel:ViewModelLocator x:Key="viewModelLocator" />
<Style TargetType="{x:Type igDP:CellValuePresenter}" x:Key="cellTemplate" x:Name="cellTemplate" >
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type igDP:CellValuePresenter}">
<Label
Content="{Binding Converter={StaticResource converter}}"
Width="200"
MaxWidth="600"
MinHeight="20"
/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<StackPanel Name="stackPanel">
<igDP:XamDataGrid Name="DifferenceGrid" DataSource="{Binding Source={StaticResource viewModelLocator}, Path=ViewModel.Model}"
ScrollViewer.CanContentScroll="True" ScrollViewer.HorizontalScrollBarVisibility="Visible" ScrollViewer.VerticalScrollBarVisibility="Visible">
<igDP:XamDataGrid.FieldLayouts>
<igDP:FieldLayout>
<igDP:FieldLayout.Fields>
<igDP:Field>
<igDP:Field.Settings>
<igDP:FieldSettings
CellValuePresenterStyle="{StaticResource cellTemplate}">
</igDP:FieldSettings>
</igDP:Field.Settings>
</igDP:Field>
</igDP:FieldLayout.Fields>
</igDP:FieldLayout>
</igDP:XamDataGrid.FieldLayouts>
</igDP:XamDataGrid>
</StackPanel>
</Window>

class ViewModelLocator
{
private static ViewModel viewModel = new ViewModel();

public ViewModel ViewModel
{
get
{
return viewModel;
}
}
}

public class ViewModel
{
private DataTable model;

public DataTable Model
{
get
{
return this.model;
}

private set
{
this.model = value;
}
}

[global::System.ComponentModel.TypeConverter(typeof(Model.CustomClass))]
public class Converter : TypeConverter, IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (this.CanConvertTo(targetType))
{
return this.ConvertTo(value);
}
else
{
return null;
}
}

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (this.CanConvertFrom(targetType))
{
return this.ConvertFrom(value);
}
else
{
return null;
}
}

public new bool CanConvertFrom(Type sourceType)
{
return sourceType == typeof(Model.CustomClass);
}

public new bool CanConvertTo(Type destinationType)
{
return destinationType == typeof(Model.CustomClass);
}

public object ConvertTo(object value)
{
return this.ConvertCustomClassToTextBlock(value);
}

public new object ConvertFrom(object value)
{
return this.ConvertCustomClassToTextBlock(value);
}

private object ConvertCustomClassToTextBlock(object value)
{
TextBlock text = new TextBlock();
Label cell = new Label();

// Construct the TextBlock.

cell.Context = text;
return text; // Or cell, whatever works.
}
}

(as your tag system won't accept any of my tags) Tags: XamDataGrid, CellValuePresenter, TypeConversion, custom cell type.