2010-03-12 13 views
8

में वर्तमान दिनांक फ्लेक्स से आ रहा हूं जहां आप घुंघराले ब्रेसिज़ के अंदर कुछ भी कर सकते हैं। मैं TextBlock प्राप्त करने की कोशिश कर रहा हूं ताकि आज की तारीख और समय को सी # में कोड किए बिना प्रदर्शित किया जा सके। मैंने भाग्य के साथ निम्नलिखित में कई अलग-अलग बदलावों की कोशिश की है।सिल्वरलाइट XAML टेक्स्टब्लॉक

TextBlock Text="{Source=Date, Path=Now, StringFormat='dd/MM/yyyy'}" 

मैं जानता हूँ कि मैं शायद सिर्फ इतना है कि करने के लिए एक संपत्ति MyDate और बाँध सेट कर सकते हैं, लेकिन मैं क्यों DateTime.Now संपत्ति को सीधे बाध्य नहीं कर सकते हैं?

उत्तर

14

सिल्वरलाइट में बाध्यकारी स्रोत स्रोत या निर्भरता वस्तु की आवश्यकता होती है। उस स्रोत ऑब्जेक्ट से आप गुणों से जुड़ सकते हैं (इसलिए परिभाषा के अनुसार आप उदाहरण सदस्यों के लिए बाध्यकारी हैं) या निर्भरता गुण।

DateTime.Now एक स्थिर संपत्ति है जिसे आप सिल्वरलाइट में सीधे बांध नहीं सकते हैं, इसलिए कुछ कोड की आवश्यकता है। अगले सबसे अच्छी बात करने के लिए कोड का उपयोग करने के लिए है: -

  • आपको क्या चाहिए संभव के रूप में एक के रूप में डी-युग्मित ढंग से ऐसा करने के लिए XAML
  • में व्यक्त किया जा सकता के रूप में ज्यादा करता है।

इसलिए हम विश्लेषण कर सकते हैं कि हमें दो चीजों की आवश्यकता है।

  1. किसी वस्तु
  2. के कहने गुण के रूप में दिनांक समय के स्थिर सदस्यों का पर्दाफाश किसी तरह एक वांछनीय उत्पादन के लिए दिनांक समय फ़ॉर्मेट करने के लिए है।

पहले आइटम को संभालने के लिए मैं एक StaticSurrogate वर्ग बनाने जहां मैं स्थिर गुणों है कि हम करने के लिए उपयोग की जरूरत के लिए उदाहरण के गुण पैदा होगा: -

public class StaticSurrogate 
{ 
    public DateTime Today { get { return DateTime.Today; } } 
    public DateTime Now { get { return DateTime.Now; } } 
} 

अब हम एक तरह से जरूरत है एक फ़ॉर्मेट करने के लिए दिनांक समय। एक मूल्य कनवर्टर, इस काम के लिए सही उपकरण है से इस Tim Heuer Blog भारी उधार: - जगह में

public class FormatConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (parameter != null) 
     { 
      string formatterString = parameter.ToString(); 

      if (!String.IsNullOrEmpty(formatterString)) 
      { 
       return String.Format(culture, String.Format("{{0:{0}}}", formatterString), value); 
      } 
     } 

     return (value ?? "").ToString(); 
    } 

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

इन दो वर्गों के साथ अब हम Xaml में आराम कर सकते हैं, पहले हम अपने संसाधनों में इन कक्षाओं के उदाहरण की जरूरत है : -

<UserControl.Resources> 
    <local:StaticSurrogate x:Key="Static" /> 
    <local:FormatConverter x:Key="Formatter" />  
</UserControl.Resources> 

अब हम ऊपर तार कर सकते हैं TextBlock: -

<TextBlock Text="{Binding Today, Source={StaticResource Static}, 
    Converter={StaticResource Formatter}, ConverterParameter='dd MMM yyy'}" /> 

नोट इस दृष्टिकोण निम्न लाभ हैं कि: -

  • हमें UserControl पर कोड जोड़ने की आवश्यकता नहीं है जिस पर टेक्स्टब्लॉक रखा गया है, और न ही हमें किसी भी डेटा संदर्भ के साथ परेशान होना है।
  • स्थिर संसाधनों को ऐप में रखा जा सकता है। स्रोत जो टेक्स्टब्लॉक का निर्माण पूरी तरह से UserControl में कुछ और जोड़ने के लिए स्वतंत्र करेंगे।
  • दिनांक प्रदर्शित करने के लिए प्रयुक्त प्रारूपण को स्वतंत्र रूप से संशोधित किया जा सकता है।
  • अतिरिक्त स्थिर गुणों तक पहुंच आसानी से StaticSurrogate कक्षा में जोड़ा जा सकता है।
+0

मेरे लिए समझ में आता है लेकिन यह फ्लेक्स वाक्य रचना की तुलना में चरम प्रतीत होता है कि: पाठ = "{नई तिथि()}"। मुझे लगता है कि यह सब इस तथ्य से उबाल जाता है कि सिल्वरलाइट केवल एक्सएएमएल के अंदर कुछ मार्कअप एक्सटेंशन का समर्थन करता है। यह अच्छा होगा अगर उन्होंने घुंघराले ब्रेस मूल्यांकन को और अधिक मजबूत बना दिया। आपकी सहायताके लिए धन्यवाद! –

7

भले ही आप सिल्वरलाइट के XAML में DateTime.Now घोषित कर सकता है (WPF में आप कर सकते हैं के बाद से - http://soumya.wordpress.com/2010/02/12/wpf-simplified-part-11-xaml-tricks/), तो आप मुद्दा यह है कि अपने समय को अद्यतन नहीं होगा। यदि आप स्थानीय टाइमर का उपयोग करते हैं जो दूसरे पर अपडेट करता है तो आप यह सुनिश्चित कर सकते हैं कि आपका समय भी अपडेट हो जाएगा।

public class LocalTimer : INotifyPropertyChanged 
{ 
    private DispatcherTimer timer; 

    public LocalTimer() 
    { 
     timer = new DispatcherTimer(); 
     timer.Interval = TimeSpan.FromSeconds(1.0); 
     timer.Tick += new EventHandler(TimerCallback); 
     this.TimeFormat = "hh:mm:ss"; 
     this.DateFormat = "dddd, MMMM dd"; 
    } 

    private void TimerCallback(object sender, EventArgs e) 
    { 
     PropertyChanged(this, new PropertyChangedEventArgs("FormattedDate")); 
     PropertyChanged(this, new PropertyChangedEventArgs("FormattedTime")); 
    } 

    public bool Enabled 
    { 
     get { return this.timer.IsEnabled; } 
     set { if (value) this.timer.Start(); else this.timer.Stop(); } 
    } 

    public string FormattedDate { get { return DateTime.Now.ToString(this.DateFormat); } set {} } 
    public string FormattedTime { get { return DateTime.Now.ToString(this.TimeFormat); } set{} } 

    public string TimeFormat { get; set; } 
    public string DateFormat { get; set; } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    #endregion 
} 

XAML आला में इस का एक उदाहरण घोषित:

<local:LocalTimer x:Key="theTime" Enabled="True" /> 

और यह सुनिश्चित करें कि अपने समय हमेशा देखा जा सकता है बंधन का उपयोग करें।

<TextBlock Text="{Binding Source={StaticResource theTime}, Path=FormattedDate, Mode=OneWay}" x:Name="TodaysDate" /> 
<TextBlock Text="{Binding Source={StaticResource theTime}, Path=FormattedTime, Mode=OneWay}" x:Name="CurrentTime" /> 
+0

क्या यह सबसे अच्छा अभ्यास है, या अपडेट करने का एक और शानदार तरीका है? – fzl

1
xmlns:sys="clr-namespace:System;assembly=mscorlib" 

Text="{Binding Source={x:Static sys:DateTime.Today}, StringFormat='Today is {0:dddd, MMMM dd}'}" 
+0

सिल्वरलाइट में सीधे ऐसा नहीं कर सकता, देखें- http://stackoverflow.com/questions/3373926/silverlight-4-equivalent-to-wpf-xstatic – davidsleeps

+0

यही कारण है कि डब्ल्यूपीएफ शानदार है। –

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