2010-05-06 15 views
6

मैं एक स्तंभ इस तरह परिभाषित किया गया है:WPF प्रारूप टेक्स्ट प्रदर्शित किया?

<DataGridTextColumn Binding="{Binding Path=FileSizeBytes, Mode=OneWay}" Header="Size" IsReadOnly="True" /> 

लेकिन बजाय एक बड़ी संख्या के रूप में फ़ाइल आकार प्रदर्शित करने में, मैं इकाइयों प्रदर्शित करना चाहते हैं, लेकिन अभी भी वास्तविक FileSizeBytes द्वारा तरह पास है। क्या ऐसा कोई तरीका है जिसे मैं इसे किसी फ़ंक्शन या इसे प्रदर्शित करने से पहले चला सकता हूं?


@Igor:

महान काम करता है।

http://img200.imageshack.us/img200/4717/imageget.jpg

[ValueConversion(typeof(long), typeof(string))] 
class FileSizeConverter : IValueConverter 
{ 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     string[] units = { "B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" }; 
     double size = (long)value; 
     int unit = 0; 

     while (size >= 1024) 
     { 
      size /= 1024; 
      ++unit; 
     } 

     return String.Format("{0:0.#} {1}", size, units[unit]); 
    } 

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

उत्तर

2

एक समारोह के लिए बाइंडिंग WPF में संभव है, लेकिन यह आम तौर पर दर्दनाक है। इस मामले में एक और संपत्ति बनाने के लिए एक और सुरुचिपूर्ण दृष्टिकोण होगा जो एक स्वरूपित स्ट्रिंग देता है और उस से बांधता है।

class FileInfo { 
    public int FileSizeBytes {get;set;} 
    public int FileSizeFormatted { 
    get{ 
    //Using general number format, will put commas between thousands in most locales. 
    return FileSizeBytes.ToString("G"); 
    } 
    } 
} 

XAML में, बाँध FileSizeFormatted रहे हैं:

<DataGridTextColumn Binding="{Binding Path=FileSizeBytes, Mode=OneWay}" Header="Size" IsReadOnly="True" /> 

संपादित वैकल्पिक समाधान, इस ओर इशारा करते हुए के लिए चार्ली के लिए धन्यवाद।

आप IValueConverter लागू करके अपना खुद का मूल्य कनवर्टर लिख सकते हैं।

[ValueConversion(typeof(int), typeof(string))] 
public class IntConverter : IValueConverter { 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { 
     //needs more sanity checks to make sure the value is really int 
     //and that targetType is string 
     return ((int)value).ToString("G"); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { 
     //not implemented for now 
     throw new NotImplementedException(); 
    } 
} 
फिर XAML में

:

<UserControl.Resources> 
    <src:DateConverter x:Key="intConverter"/> 
</UserControl.Resources> 
... 
<DataGridTextColumn Binding="{Binding Path=FileSizeBytes, Mode=OneWay, Converter={StaticResource intConverter}}" Header="Size" IsReadOnly="True" /> 
+1

इस मामले में कि आप स्रोत वर्ग में कोई अन्य संपत्ति नहीं जोड़ सकते हैं (इसके लिए कई कारण हो सकते हैं), दूसरा समाधान एक IValueConverter बनाना होगा और कनवर्टर प्रॉपर्टी का उपयोग करके बाध्यकारी को देना होगा। फिर हर बार बाध्यकारी अद्यतन यह कनवर्टर कोड के माध्यम से पहले चला जाएगा। – Charlie

+0

हाँ, अच्छा बिंदु। इसके लिए वैकल्पिक स्रोत स्रोत को एक व्यूमोडेल में लपेटना होगा, जो कुछ मामलों में एक ओवरकिल हो सकता है। –

+0

कारण मैं अधिक संपत्तियों के साथ नहीं जाना चाहता क्योंकि मुझे उनमें से प्रत्येक के लिए एक संपत्ति चेंज किया गया कार्यक्रम आग लगाना है ... मैं अनिवार्य रूप से वही चीज़ों के लिए दर्जनों ट्रिगर्स के साथ हवा कर सकता हूं! इसके अलावा, आप डेटा के साथ प्रस्तुति दे रहे हैं। हालांकि मुझे दूसरी सोल पसंद है। – mpen

1

स्वरूपण प्रयोजनों के लिए, उचित कार्यान्वयन एक IValueConverter को परिभाषित किया गया है। इस नमूना को देखें: link text

4

यदि आप .NET 3.5SP1 या बाद में उपयोग कर रहे हैं तो आप अपनी बाध्यकारी अभिव्यक्ति में स्ट्रिंगफॉर्मैट का उपयोग करने का प्रयास कर सकते हैं। कुछ वाक्यविन्यास उदाहरणों के लिए this post on Lester's WPF Blog या this post at Vince Sibal's blog देखें। बाइंडिंग के लिए स्ट्रिंगफॉर्मेट के अतिरिक्त वैल्यू कन्वर्टर्स के लिए अधिकांश ज़रूरतों को खत्म कर देगा और आसानी से किसी अन्य वर्ग में बंद होने के बजाय अपने स्वरूपण को अपने मार्कअप के साथ रखेगा। यह निश्चित रूप से बहुत कम टाइपिंग भी है।

हो सकता है कि कुछ इस तरह काम करेगा:

<DataGridTextColumn 
    Binding="{Binding Path=FileSizeBytes, Mode=OneWay, StringFormat='\{0:N0\} bytes'}" 
    Header="Size" IsReadOnly="True" /> 

मुझे यकीन है कि नहीं कर रहा हूँ अगर शीर्षक पर क्लिक आइटम सॉर्ट करने के लिए उन्हें स्ट्रिंग के रूप में या अंतर्निहित डेटा प्रकार के रूप में सॉर्ट होगा, हालांकि, इतने पर निर्भर करता है क्या आपकी स्वरूपण अभिव्यक्ति इस तरह दिखती है, आप वांछित सॉर्टिंग व्यवहार प्राप्त कर सकते हैं या नहीं भी।

संबंधित मुद्दे