Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C WPF绑定到singleton类中的可观察对象_C#_Wpf_Xaml_Binding_Singleton - Fatal编程技术网

C# C WPF绑定到singleton类中的可观察对象

C# C WPF绑定到singleton类中的可观察对象,c#,wpf,xaml,binding,singleton,C#,Wpf,Xaml,Binding,Singleton,我尝试将一个单例绑定到我的listview。 singleton是一个简单的日志类,它将所有新传入的日志消息放在一个可观察对象中。此对象已绑定到我的xaml代码 单身人士类别: namespace Log { public sealed class CLog { private CLog() { } private static object m_lock = new object(); private static CLog _instance; publi

我尝试将一个单例绑定到我的listview。 singleton是一个简单的日志类,它将所有新传入的日志消息放在一个可观察对象中。此对象已绑定到我的xaml代码

单身人士类别:

namespace Log
{
public sealed class CLog
{
    private CLog() { }

    private static object m_lock = new object();

    private static CLog _instance;
    public static CLog instance
    {
        get
        {
            if (_instance == null)
            {
                lock (m_lock)
                {
                    if (_instance == null)
                    {
                        _instance = new CLog();
                    }
                }
            }
            return _instance;
        }
    }

    private ObservableCollection<CLogMessage> _logs = new ObservableCollection<CLogMessage>();
    public ObservableCollection<CLogMessage> logs
    {
        get
        {
            if (_logs == null)
            {
                _logs = new ObservableCollection<CLogMessage>();
            }
            return _logs;
        }
    }

    public void AddString(string source, string message)
    {
        CLogMessage log = new CLogMessage();
        log.time = DateTime.Now;
        log.source = source;
        log.message = message;
        System.Windows.Application.Current.Dispatcher.Invoke(
            (Action)delegate()
        {
            logs.Add(log);
        });
    }
}

public sealed class CLogMessage
{
    public DateTime time { get; set; }
    public string source { get; set; }
    public string message { get; set; }
}
}

列表视图中的我的绑定:

<Grid>
    <ListView ItemsSource="{Binding Source={x:Static local:CLog.instance}, Path=logs}">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Zeit" Width="140" DisplayMemberBinding="{Binding time}"/>
                <GridViewColumn Header="Quelle" Width="140" DisplayMemberBinding="{Binding source}"/>
                <GridViewColumn Header="Nachricht" Width="Auto" DisplayMemberBinding="{Binding message}"/>
            </GridView>
        </ListView.View>
    </ListView>
</Grid>
问题是我的视图没有更新。出于调试目的,我通过一个简单的CLog.instance.logs.Count从不同的类随机测试了singleton类。工作非常好,我只是在视图中显示项目时遇到问题。 我非常模糊的建议是,我必须为绑定对象本身实现一个通知


谢谢

我相信问题是由listview从一开始就绑定到空项源引起的。由于我现在没有一台机器来测试这一点,也许您可以通过更改日志周围的代码来验证这一点:


两个随机注释,C中的属性应该是PascalCase,从技术上讲这不是一个单例,因为您没有私有构造函数。除此之外,我不完全确定您为什么会有问题,尽管x:Static sure看起来可疑。。。您为什么不能通过VM上的属性公开该集合?我使用x:Static,因为属性实例是静态的。过去,如果我使用Dispatcher向集合添加项,则UI不会更新。如果你删除了调度程序代码,它能工作吗?@BradleyDotNET,因为作者使用单例模式来阻塞。好吧,我最好去睡觉。我发现了错误。日志视图作为usercontrol绑定到我的面板。所以我在我的面板上放了一个新的gridview,也使用了像我的日志控件do和voila这样的精确绑定,它工作了。在那之后,我在我的日志用户控制设置中发现了一个非常愚蠢的设置:height='34'。所以数据总是显示出来的,但是盒子太小了。是的,我很惭愧。非常感谢你的帮助。嗨,对不起。这一解决办法没有奏效。但这难道不是财产的任务吗?它检查对象是否为空,如果为空,将创建一个新实例。嗯,反正也不行。
private ObservableCollection<CLogMessage> _logs = 
    new ObservableCollection<CLogMessage>();
public ObservableCollection<CLogMessage> logs
{
    get { return _logs; }
}

public void AddString(string source, string message)
{
    CLogMessage log = new CLogMessage();
    log.time = DateTime.Now;
    log.source = source;
    log.message = message;
    System.Windows.Application.Current.Dispatcher.Invoke(
        (Action)delegate()
    {
        _logs.Add(log);
    });
}