C# 为什么我的可观察到的收集没有被观察到?

C# 为什么我的可观察到的收集没有被观察到?,c#,wpf,xaml,nlog,C#,Wpf,Xaml,Nlog,我在用户控件中有以下元素,作为默认网格的唯一子元素: <ListView ItemsSource="{Binding LogCollection}" Name="LogView"> <ListView.View> <GridView> <GridView.Columns> <GridViewColumn DisplayMemberBinding="{Binding

我在用户控件中有以下元素,作为默认
网格的唯一子元素:

<ListView ItemsSource="{Binding LogCollection}" Name="LogView">
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn DisplayMemberBinding="{Binding Level}" Header="Level"/>
                <GridViewColumn DisplayMemberBinding="{Binding FormattedMessage}" Width="500" Header="Message"/>
                <GridViewColumn DisplayMemberBinding="{Binding Exception}" Header="Exception"/>
            </GridView.Columns>
        </GridView>
    </ListView.View>
</ListView>
事件很好地激发,当我单步执行代码时,
Add
调用是reach。当我在执行时将鼠标移到XAML视图中的
LogCollection
上时,我在Add
调用后看到一个“Count=1”,但我的
ListView`仍然非常高兴地没有意识到它应该向我显示一个日志事件

好的,好的,我的用户控件后面的简略代码是:

public partial class LoggingControl : UserControl
{
    public ObservableCollection<LogEventInfo> LogCollection { get; set; }
    public LoggingControl()
    {
        LogCollection = new ObservableCollection<LogEventInfo>();
        InitializeComponent();

        foreach (Target target in LogManager.Configuration.AllTargets)
        {
            var memoryEventTarget = target as MemoryEventTarget;
            if (memoryEventTarget != null)
            {
                memoryEventTarget.EventReceived += EventReceived;
            }
        }
    }

    private void EventReceived(LogEventInfo message)
    {
        Dispatcher.BeginInvoke(new Action(() =>
                    {
                        LogCollection.Add(message);
                    }));
    }
}
公共部分类LoggingControl:UserControl
{
公共ObservableCollection日志集合{get;set;}
公共日志管理()
{
LogCollection=新的ObservableCollection();
初始化组件();
foreach(LogManager.Configuration.AllTargets中的目标)
{
var memoryEventTarget=作为memoryEventTarget的目标;
如果(memoryEventTarget!=null)
{
memoryEventTarget.EventReceived+=EventReceived;
}
}
}
收到私有void EventReceived(LogEventInfo消息)
{
Dispatcher.BeginInvoke(新操作(()=>
{
LogCollection.Add(消息);
}));
}
}

您确定实际添加项的LogCollection就是要将网格绑定到的LogCollection吗?我已经创建了一个示例应用程序,其中包含您的代码,但工作正常?也许你需要发布更多的代码


也许您的ItemsSource绑定现在可以正常工作了。您在控制台中看到任何绑定错误吗?类似于“BindingExpression路径错误:'LogCollection'属性未在'object'上找到”的内容,如注释中所述,它看起来像是ListView的绑定上下文。ItemsSource
绑定错误<代码>数据上下文
。在您的情况下,手动设置
DataContext
可以解决问题

this.DataContext = this; 
但这需要在创建
LogCollection
后进行,因为属性本身不会引发
INotifyPropertyChanged.PropertyChanged
事件

要回答为什么默认情况下
DataContext
未设置为self,是因为
DataContext
在整个可视树中都是继承的。因此,
UserControl
,与任何其他
FrameworkElement
一样,默认情况下将从放置它的元素继承它的
DataContext

另一件值得注意的事情是,只能有一个
DataContext
值。它将从可视树继承,或在
UserControl
中手动设置。通过使用
RelativeSource
ElementName
绑定,您可以使用继承的上下文并仍然绑定到
UserControl
属性



two-way binding与这个场景没有任何关系。@MilanNankov我同意,但无论如何还是给了它一个痛击。我在列表中没有做任何必须绑定回集合的操作,它只能读取它。顺便说一句,@MilanNankov和我的注释仅在另一条注释的上下文中,因为删除了该注释。LogCollection可能是ViewModel上的一个属性?如果是这样,请确保在将该属性设置为PropertyChanged时,该属性会在重新分配(或初始化)该属性时引发PropertyChanged,并更新绑定。为确保发布ViewModel的代码。@ErnodeWeerd否,
LogCollection
是控件的属性,我将
列表视图定义为打开。我知道,我应该使用ViewModel,但在它们正常工作之前必须先工作。是的,只有一个
LogCollection
。我在输出窗口中没有看到任何错误,只看到日志消息,因为我的自定义日志目标也在其他地方写入。我将在初始化集合时尝试直接添加到集合中,以查看它是否获得初始内容。然后我将查看您的示例,然后进行一些大规模编辑,以发布更多代码,而不会过多地浪费此页面。可能您的绑定不起作用,因为您的DataContext设置不正确-您的日志集合不是DataContext的属性。您已经说过,LogCollection属性是在您拥有GridView的控件上定义的。如果是这种情况,只需在控件的构造函数中将控件本身设置为DataContext。例如,在控件的构造函数中->this.DataContext=this;我说过
LogCollection
是我的用户控件的属性,而不是我的用户控件上或其
网格中的任何内容的属性。我已经说过ListView是我的用户控件上唯一的子控件。是的,谢谢,我刚刚意识到,在
UserControl
中,我必须将dc设置为Self,否则它将从其父控件继承+1获取关于更显式绑定的额外提示。
this.DataContext = this;