2016-11-30 49 views
0

我的目標是將格式字符串(如「A__B」)傳遞到DataGrid列的標題,並將其顯示爲帶下標B的 A(即A_B )。爲了在每列的基礎上做到這一點,我打算爲此使用模板如下。WPF DataGridColumnHeader模板中的簡單數學樣式的數據綁定/轉換

<DataGridTextColumn Binding="{Binding AB}", Header="A__B" HeaderStyle="{StaticResource ColumnHeaderTemplate}" />    

爲了完成合適的模板的實現,我想我可能想使用轉換器。因此,我寫了一個簡單的轉換器,它將字符串拆分爲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

錯誤在於您的轉換器 - 即您試圖轉換該參數,而不是該值,因爲您沒有指定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

我的確放置了一個斷點,但不幸的是在空檢查之後,出於某種原因,我認爲轉換從未觸發過。我的錯...但我真的很高興,因爲我錯過了一些關於綁定機制如何工作的重要東西,我完全瘋了。非常感謝你的幫助 :-)! –