绑定到Singleton类可观察集合成员

met*_*cle 12 wpf singleton binding static

我似乎无法弄清楚这一点.我在这里找到了一些类似的问题,但要么我无法找到正确的方向,要么我正在做一些完全错误的事情.

我的应用程序有一个Singleton类记录器,它保存程序中每个类的日志消息.

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

}
Run Code Online (Sandbox Code Playgroud)

现在我想在我的MainWindow中将Log绑定到ListBox,但我无法弄清楚正确的Binding

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

tools是我的XAML中单例类的命名空间.我确信这比我想象的要简单,但我只是忽略了一些东西.

Sve*_*enG 25

将您的GetInstance()方法设为get属性.并确保在您访问它之前实例化您的日志Observable Collection.这样,如果在您调用第一个Add()方法之前绑定绑定,则不会覆盖绑定.

XAML:

ItemsSource="{Binding Source={x:Static tools:Logger.Instance}, Path=Log}"
Run Code Online (Sandbox Code Playgroud)

记录仪:

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);
    }
Run Code Online (Sandbox Code Playgroud)