我的目標是將格式字符串(如「A__B」)傳遞到DataGrid列的標題,並將其顯示爲帶下標B的 A(即 )。爲了在每列的基礎上做到這一點,我打算爲此使用模板如下。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中提供了相當有限的調試工具鏈,這對我來說很難找出哪裏出了問題以及從哪裏開始。
我可能已經在綁定遊戲中獲得了所涉及的依賴關係,完全錯誤,這可能是由於我缺乏對底層機制的理解,尤其是涉及到模板時。因此,我很感激任何有用的提示!
任何想法?
你是什麼意思_「沒有按預期工作」_?請澄清您獲得的結果以及它們與預期的不同之處。 – Grx70
好的,我明白你的意思了。我的意思是我沒有看到預期的結果(在頭文件中呈現A__B),我不知道底下會發生什麼,因爲我不知道如何調試這樣的東西。如果我刪除綁定並用純文本替換它們,文本就會顯示出來,所以很明顯,我在這裏綁定數據的想法肯定是錯誤的。我會盡我所能來糾正這個問題。謝謝! –
我們已經建立了您沒有看到的內容,但是您看到**是什麼**?沒有? ' 「A__B」'? '「AB」'沒有下標?還有別的嗎? – Grx70