Alex Rivera | Logout

Binding To Singleton Class Observable Collection Member

Asked 2012-04-20T07:53:06.977
14

I just can't seem to figure this out. I found some similar Questions here but either I can't figure out the right direction for my approach or I am doing something completly wrong.

My Application has a Singleton Class Logger, which saves Log messages from every class in my program.

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

}

Now I want to bind Log to ListBox in my MainWindow, but I can't figure out the right Binding

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

tools is the namespace of the singleton class in my XAML. I'm sure this is simpler than I think, but I am just overlooking something.

Edit
Report

1 Answer

5

You can keep GetInstance to be a method and use ObjectDataProvider:

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

But again you have to initialize _Log on constructor or GetInstance.

answered 2012-04-20T08:44:05.960

Your Answer