Infragisticsでも質問しましたが、コードのフォーマット方法がわからないため、ここでは適切にフォーマットされています。
私の目標は、複数の色を使用して各セルのテキストを含む構造化データの表を提示することです。カスタムクラスに保存されているデータを、さまざまな色の複数のテキスト要素を含むラベルまたはテキストブロックに変換するタイプコンバーターがあります。データはデータテーブルで提供され(機能する方法であれば問題ありません)、各値がセルに正しく適用されます。
問題は、TypeConverterを使用する代わりに、ToStringメソッドを使用することです。これをオーバーライドすると、モデルの正しいモデルデータがセルごとにグリッドにマッピングされることがわかります。また、私が使用しているControlTemplateプロパティは適用されません。これは、ControlTemplateが使用されていないことを示しています。
懸念されるのは、データグリッド内で異なる文字の色が異なるテキストを含めることができない場合があることです。もしそうなら、優れたユーザーエクスペリエンスを維持し、デザインをxamlファイル(グリッドでは難しい)に保持しながら実行できる別の方法はありますか。
私のコードはカスタムCellValuePresenterを定義する必要があることを理解しているので、誰かがそれを適用するのを手伝ってくれませんか?
関連するコードをここに投稿しています。そのほとんどは難読化されているため、スペルミスに焦点を当てないでください。
<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)
{
// Textboxes don't need to be converted back.
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.
}
}