2012-04-20 21 views
9

पर बाध्यकारी मैं इसे समझने के लिए प्रतीत नहीं कर सकता। मुझे यहां कुछ समान प्रश्न मिलते हैं लेकिन या तो मैं अपने दृष्टिकोण के लिए सही दिशा नहीं समझ सकता या मैं कुछ गलत कर रहा हूं।सिंगलटन क्लास अवलोकन करने योग्य संग्रह सदस्य

मेरे एप्लिकेशन में सिंगलटन क्लास लॉगर है, जो मेरे प्रोग्राम में प्रत्येक कक्षा से लॉग संदेश सहेजता है।

public class Logger 
{ 
    private Logger() 
    { 

    } 

    private static volatile Logger instance; 

    public static Logger GetInstance() 
    { 
     // DoubleLock 
     if (instance == null) 
     { 
      lock (m_lock) 
      { 
       if (instance == null) 
       { 
        instance = new Logger(); 
       } 
      } 
     } 
     return instance; 
    } 

    //Helper for Thread Safety 
    private static object m_lock = new object(); 

    private ObservableCollection<string> _Log; 

    public ObservableCollection<string> Log 
    { 
     get { return _Log; } 
    } 

    public void Add(string text) 
    { 
     if (_Log == null) 
      _Log = new ObservableCollection<string>(); 

     Log.Add(DateTime.Now.ToString() + " " + text); 
    } 

    public void Clear() 
    { 
     _Log.Clear(); 
    } 

} 

अब मैं अपने MainWindow में प्रवेश करें ListBox करने के लिए बाध्य करना चाहते हैं, लेकिन मैं बाइंडिंग

<ListBox Name="lstboxLog" Grid.Row="2" Margin="10,0,10,10" ItemsSource="{Binding Source={x:Static tools:Logger.Log}}" Height="100" /> 

उपकरण सही को समझ नहीं सकता मेरी XAML में सिंगलटन वर्ग के नाम स्थान है। मुझे यकीन है कि यह मेरे विचार से सरल है, लेकिन मैं बस कुछ दिख रहा हूं।

उत्तर

18

अपनी संपत्ति प्राप्त करने के लिए GetInstance() विधि बनाएं। और सुनिश्चित करने के लिए कि आप इसे एक्सेस करने से पहले अपने लॉग अवलोकन संग्रह को तुरंत चालू करें। इस तरह बाध्यकारी अतिरंजित नहीं होगा अगर इससे पहले कि आप अपनी पहली Add() विधि को कॉल करें।

XAML:

ItemsSource="{Binding Source={x:Static tools:Logger.Instance}, Path=Log}" 

लॉगर:

public static Logger Instance 
    { 
     get 
     { 
     // DoubleLock 
     if (instance == null) 
     { 
     lock (m_lock) 
     { 
      if (instance == null) 
      { 
      instance = new Logger(); 
      } 
     } 
     } 
     return instance; 
     } 
    } 

    //Helper for Thread Safety 
    private static object m_lock = new object(); 

    private ObservableCollection<string> _Log; 

    public ObservableCollection<string> Log 
    { 
     get 
     { 
     if (_Log == null) 
     { 
      _Log = new ObservableCollection<string>(); 
     } 
     return _Log; 
     } 
    } 

    public void Add(string text) 
    { 
     Log.Add(DateTime.Now.ToString() + " " + text); 
    } 
+1

यह चाल है, बहुत बहुत धन्यवाद! – metacircle

3

आप GetInstance रख सकते एक विधि हो सकता है और ObjectDataProvider उपयोग करने के लिए:

<Window.Resources> 
    <ObjectDataProvider x:Key="data" 
         ObjectType="{x:Type local:Logger}" 
         MethodName="GetInstance" /> 
</Window.Resources> 
<ListBox ItemsSource="{Binding Source={StaticResource data},Path=Log}"/> 

लेकिन फिर आप के लिए है _Log चालू करें कन्स्ट्रक्टर या GetInstance।

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