2012-04-20 12 views
9

私はこれを理解できないようです。私はここにいくつかの同様の質問を見つけたが、私は私のアプローチの正しい方向性を理解できないか、何か完全に間違っている。シングルトンクラスへのバインディングObservable Collection Member

My Applicationには、プログラムのすべてのクラスからのログメッセージを保存するシングルトンクラスのLoggerがあります。

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(); 
    } 

} 

今、私は私のメインウィンドウにリストボックスにログインをバインドしたいが、私は

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

ツールをバインド権利を把握することはできませんが、私のXAMLでシングルトンクラスの名前空間です。私はこれが私が思うより簡単だと確信していますが、私はただ見落としています。

答えて

18

GetInstance()メソッドをgetプロパティに設定します。 それにアクセスする前に、Observable Collectionログをインスタンス化してください。こうすることで、最初の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}"/> 

しかし、再び、あなたがする必要があります_ログオンを初期化するコンストラクタまたはGetInstance。

関連する問題