2016-11-30 1 views
0

목표는 "A__B"와 같은 형식 문자열을 DataGrid 열의 머리글에 전달하고 A와 같이 아래 첨자 B로 표시하는 것입니다 (즉 A_B). 이 작업을 열 단위로 수행하기 위해이 템플릿을 다음과 같이 사용하려고합니다.WPF DataGridColumnHeader 템플릿에서 간단한 수학 스타일링을위한 데이터 바인딩/변환

적절한 템플릿을 구현하려면 변환기로 작업해야 할 수도 있습니다. 따라서 나는 문자열을 Symbol 클래스의 객체로 분할하고 Text 및 Subscript 속성을 갖는 간단한 변환기를 작성했습니다.

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

변환기에 오류가 있습니다. 즉, 값 대신 null 인 매개 변수를 변환하려고합니다. 변환기가 사용되는 바인딩에 ConverterParameter을 지정하지 않았기 때문입니다. 따라서 빈 열 머리글이 나타납니다. 당신은 대신 값을 변환해야합니다 : 버그 이런 종류의 디버깅에 매우 쉽다는 것을

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

실제로 중단 점을 배치했지만, 불행하게도 null 확인 후 어떤 이유로 변환이 실행되지 않았다고 가정했습니다. 내 잘못이야...그러나 저는 바인딩 메커니즘이 어떻게 작동하는지에 관해 중요한 것을 놓친 것보다 완전히 미쳐 가고 있었기 때문에 실제로 이것이 바보 같은 것이라고 아주 기쁩니다. 도와 주셔서 정말로 고맙습니다 :-)! –