목표는 "A__B"와 같은 형식 문자열을 DataGrid 열의 머리글에 전달하고 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에서 다소 제한된 디버깅 도구 체인을 사용하면 잘못된 점과 여기서 어디로 갈지를 찾는 것이 상당히 힘듭니다.
바인딩 게임의 관련 종속성이 완전히 잘못되었을 수 있습니다. 이는 내 기본 메커니즘을 이해하지 못함으로 인해 발생할 수 있습니다. 특히 템플릿과 관련하여 특히 그렇습니다. 따라서 도움이되는 힌트에 감사드립니다!
아이디어가 있으십니까?
_ "예상대로 작동하지 않음"이란 정확히 무엇을 의미합니까? 받고있는 결과와 예상과 다른 결과를 명확히하십시오. – Grx70
좋아, 네가 무슨 뜻인지 알 겠어. 나가 의미 한 무엇을 나가 머리말에있는 A__B의 예기 한 결과를 보지 않으며 나가 후비는 물건으로 이것 같이 벌채하는 방법을 모르기 때문에 나는 잘 모른다. 바인딩을 제거하고 일반 텍스트로 바꾼다면 텍스트가 나타납니다. 여기서 데이터 바인딩에 대한 제 생각에는 분명히 잘못된 것이 틀림 없습니다. 질문을 바로 잡기 위해 최선을 다할 것입니다. 감사! –
우리는 당신이 보지 못하는 것을 이미 확립 해 놓았지만 ** 무엇을보고 있습니까 **. 아무것도? ''A__B ''? ''AB '''아래 첨자가 없습니까? 다른 것? – Grx70