C# C WPF绑定到singleton类中的可观察对象
我尝试将一个单例绑定到我的listview。 singleton是一个简单的日志类,它将所有新传入的日志消息放在一个可观察对象中。此对象已绑定到我的xaml代码 单身人士类别: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
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);
});
}