私の目標は、 "A__B"のようなフォーマット文字列をDataGrid列のヘッダーに渡して、 Aと添え字B(つまり、 )。これを列単位で行うには、以下のようにテンプレートを使用します。WPFのDataGridColumnHeaderテンプレートで単純な数式スタイルのデータバインディング/変換
<DataGridTextColumn Binding="{Binding AB}", Header="A__B" HeaderStyle="{StaticResource ColumnHeaderTemplate}" />
適切なテンプレートの実装を実現するために、私はコンバータで作業したいと思っていました。したがって、私は という文字列をTextクラスとSubscriptというプロパティを持つSymbolクラスのオブジェクトに分割するシンプルなコンバータを書きました。
using System;
using System.Windows.Data;
using System.Globalization;
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace Test
{
public class Symbol : INotifyPropertyChanged
{
string text_, subscript_;
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
public Symbol(string text, string subscript)
{
Text = text;
Subscript = subscript;
NotifyPropertyChanged();
}
public String Text
{
get { return text_; }
set { text_ = value; NotifyPropertyChanged(); }
}
public String Subscript
{
get { return subscript_; }
set { subscript_ = value; NotifyPropertyChanged(); }
}
}
[ValueConversion(typeof(string), typeof(Symbol))]
public class StringToSymbolConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (parameter == null) return null;
var format = parameter as string;
int idx = format.IndexOf("__");
if (idx < 0) return new Symbol(format, "");
return new Symbol(format.Substring(0, idx), format.Substring(idx + 2);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return null;
}
}
}
私は、ウィンドウのリソース
<Window.Resources>
<l:StringToSymbolConverter x:Key="stringToSymbolConverter" />
</Window.Resources>
にこのコンバーターを追加しましたそして、私のデータグリッドに私はここで、以下の
<DataGrid x:Name="dataGrid" ItemsSource="{Binding Results}" AutoGenerateColumns="False">
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridColumnHeader}" x:Key="ColumnHeaderTemplate">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock TextWrapping="Wrap" DataContext="{Binding Converter={StaticResource stringToSymbolConverter}}">
<Run Text="{Binding Path=Text}"/>
<Run Text="{Binding Path=Subscript}" BaselineAlignment="Subscript" FontSize="8"/>
</TextBlock>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding AB, Mode=OneWay}" ClipboardContentBinding="{x:Null}" Header="A__B" HeaderStyle="{StaticResource ColumnHeaderTemplate}" />
</DataGrid.Columns>
</DataGrid>
私の考えは、かつて してから変換を行うことですでしたSymbolオブジェクトにあるコンポーネントを適切な場所に差し込みます。このため私は、テキストブロックのDataContextを(誤って)使用しようとしました。
これは期待どおりに動作せず、目に見える出力が得られません。私はテンプレートがそれぞれの列に適用されていることを知っているので、私はそのような権利を持っているようです。また、バインディングをプレーンテキストで置き換えるか、フォールバック値を追加すると、テキストが正しくレンダリングされます。私は、バインディングが失敗し、実行時に空の文字列を渡すと思われます。 WPFの初心者であり、XAML/WPFでかなり限定されたデバッグツールチェーンが与えられているので、何が間違っているのか、ここからどこに行くのかがわかります。
私は、拘束力のあるゲームの依存関係を完全に間違っている可能性があります。これは、特にテンプレートに関しては、根本的なメカニズムの理解が不足している可能性があります。したがって、私は有用なヒントに感謝しています!
アイデア?
「期待どおりに動作しない」というのは、正確にはどういう意味ですか?あなたが得ている結果とあなたの期待との違いを明確にしてください。 – Grx70
さて、私はあなたが意味するものを参照してください。私が意図したことは、予期した結果(ヘッダーにA__Bのレンダリング)が表示されず、このようなものをデバッグする方法がわからないので、何が起こっているのかわからないということです。バインディングを削除してプレーンテキストで置き換えると、テキストが表示されるので、ここでデータをバインドする考えは間違っているはずです。私は質問を解決するために全力を尽くします。ありがとう! –
私たちはあなたが見ていないものをすでに確立していますが、**あなたは何を見ていますか?何もない? '' A__B ''? '' AB "' '添え字なし?他に何か? – Grx70