2011-04-20 17 views
6

WPF DataGrid की व्यक्तिगत कोशिकाओं पर स्ट्राइकथ्रू शैली में फ़ॉन्ट सेट करने का सबसे अच्छा (आसान) तरीका क्या है?WPF DataGrid की व्यक्तिगत कोशिकाओं पर स्ट्राइकथ्रू सेट करने का सबसे अच्छा तरीका?

...

विकल्प है कि मैं अलग-अलग कक्षों में TextBlock नियंत्रण डालने कर रहे हैं या एक DataGridTemplateColumn का उपयोग कर के बारे में पता कर रहा हूँ - और उसमें TextDecorations संपत्ति का उपयोग कर। किसी भी तरह से यह एक मिशन है, मैं डेटाग्रिड के डिफ़ॉल्ट ऑटो जेनरेट कॉलम फ़ंक्शन का उपयोग करना चाहता हूं, खासकर जब से मेरा आइटमसोर्स डेटाटेबल है।

डिफ़ॉल्ट रूप से डिफ़ॉल्ट डेटाग्रिडटेक्स्ट कॉलम का उपयोग करके जेनरेट किए गए टेक्स्टब्लॉक तक पहुंचने का कोई तरीका है?

उत्तर

6
<DataGridTextColumn Binding="{Binding Name}"> 
    <DataGridTextColumn.ElementStyle> 
     <Style TargetType="{x:Type TextBlock}"> 
      <Setter Property="TextDecorations" Value="Strikethrough"/> 
     </Style> 
    </DataGridTextColumn.ElementStyle> 
</DataGridTextColumn> 

बेशक आप इसे चुनने के लिए डेटाट्रिगर में सेटटर को लपेट सकते हैं।

+1

यदि आप संपूर्ण स्तंभ कर रहे हैं, यह करने के लिए एक अच्छा तरीका है, आप एक अच्छी है व्यक्तिगत कोशिकाओं को करने का तरीका? इसके अलावा मेरे मामले में मुझे इसे कोड में करने की ज़रूरत है, क्योंकि मेरे पास DataGridTextColumn को बाध्य करने के लिए कुछ भी आसान नहीं है। – SDK

+1

जैसा कि मैंने कहा था, कुछ कोशिकाओं तक सीमित करने के लिए डेटा ट्रिगर का उपयोग करें, और कोड के पीछे कोड करना कोई समस्या नहीं होनी चाहिए, यह केवल अनुवाद का मामला है। –

0

यदि आप किसी विशेष सेल के आधार पर स्ट्राइकथ्रू को बाध्य करना चाहते हैं, तो आपके पास बाध्यकारी समस्या है, क्योंकि DataGridTextColumn.Binding केवल TextBox.Text की सामग्री को बदलता है।

<Setter Property="TextDecorations" 
    Value="{Binding RelativeSource={RelativeSource Self}, 
    Path=Text, 
    Converter={StaticResource TextToTextDecorationsConverter}}" /> 

लेकिन अगर आप TextBox.Text से कुछ अलग करने के लिए बाध्य करने के लिए चाहते हैं, आप DataGridRow, है, जिसके माध्यम से बाध्य करने के लिए है: पाठ संपत्ति के मूल्य सब है, तो आप या तो टेक्स्ट बॉक्स में ही करने के लिए बाध्य कर सकते हैं की जरूरत है दृश्य पेड़ में टेक्स्टबॉक्स के माता-पिता। DataGridRow में एक आइटम प्रॉपर्टी है, जो पूरी पंक्ति के लिए उपयोग की जाने वाली पूरी वस्तु तक पहुंच प्रदान करती है।

<Setter Property="TextDecorations" 
    Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}, 
    Path =Item.SomeProperty, 
    Converter={StaticResource SomePropertyToTextDecorationsConverter}}" /> 

कनवर्टर इस तरह दिखता है, कुछ संभालने प्रकार बूलियन की है:

public class SomePropertyToTextDecorationsConverter: IValueConverter { 
    public object Convert(object value, Type targetType, object parameter, 
    CultureInfo culture) 
    { 
     if (value is bool) { 
     if ((bool)value) { 
      TextDecorationCollection redStrikthroughTextDecoration = 
      TextDecorations.Strikethrough.CloneCurrentValue(); 
      redStrikthroughTextDecoration[0].Pen = 
      new Pen {Brush=Brushes.Red, Thickness = 3 }; 
      return redStrikthroughTextDecoration; 
     } 
     } 
     return new TextDecorationCollection(); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, 
     CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
    }