2016-11-30 22 views
0

私の目標は、 "A__B"のようなフォーマット文字列をDataGrid列のヘッダーに渡して、 Aと添え字B(つまり、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でかなり限定されたデバッグツールチェーンが与えられているので、何が間違っているのか、ここからどこに行くのかがわかります。

私は、拘束力のあるゲームの依存関係を完全に間違っている可能性があります。これは、特にテンプレートに関しては、根本的なメカニズムの理解が不足している可能性があります。したがって、私は有用なヒントに感謝しています!

アイデア?

+2

「期待どおりに動作しない」というのは、正確にはどういう意味ですか?あなたが得ている結果とあなたの期待との違いを明確にしてください。 – Grx70

+0

さて、私はあなたが意味するものを参照してください。私が意図したことは、予期した結果(ヘッダーにA__Bのレンダリング)が表示されず、このようなものをデバッグする方法がわからないので、何が起こっているのかわからないということです。バインディングを削除してプレーンテキストで置き換えると、テキストが表示されるので、ここでデータをバインドする考えは間違っているはずです。私は質問を解決するために全力を尽くします。ありがとう! –

+0

私たちはあなたが見ていないものをすでに確立していますが、**あなたは何を見ていますか?何もない? '' A__B ''? '' AB "' '添え字なし?他に何か? – Grx70

答えて

1

エラーがあなたのコンバータである - つまり、値ではなく、あなたがあなたのコンバータが使用されている場所で結合するためのConverterParameterを指定しなかったので、nullあるパラメータを、変換しようとしています。したがって、空の列見出しが表示されます。あなたが代わりに値に変換する必要がありますバグこの種のデバッグにかなり簡単であることを

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    //here you should use 'value' instead of 'parameter' 
    if (value == null) return null; 
    var format = value as string; 

    int idx = format.IndexOf("__"); 
    if (idx < 0) return new Symbol(format, ""); 

    return new Symbol(format.Substring(0, idx), format.Substring(idx + 2); 
} 

注意を - あなたは、コンバータが関与しているバインディングの問題に直面している時はいつでも、それはConvertメソッドにブレークポイントを設定することが有益であるとステップスルー。

+0

私は実際にブレークポイントを設定しましたが、残念なことにヌルチェックの後に何らかの理由で変換が起きなかったと私は想定しました。私の悪い...しかし、私は実際には、これが愚かなものであることをとても嬉しく思っています。なぜなら、バインディングメカニズムの仕組みにおいて何か重要なことを見逃してしまったことを完全に狂ってしまったからです。あなたの助けをたくさんありがとう:-)! –

関連する問題