使用UI线程的Dispatcher添加到ObservableCollection时遇到问题

时间:2014-10-17 18:40:56

标签: c# wpf multithreading backgroundworker observablecollection

这里有很多关于使用后台工作线程更新控件(主要是ObservableCollection)的问题。我正在尝试实施this solution。但是,我的情况稍微深一点,因为它调用add方法中的一个函数来返回要添加的对象。

这就是我的解决方案现在的样子(请注意我的ObservableCollection绑定了TreeView控件):

//Pass from Background Thread
MainTreeViewModel.AddLocation(locationName, locationValue);

//UI Thread (MainTreeViewModel)
public void AddLocation(MultiItemString displayName, int locationValue)
{
    var node = Data.GetAllChildren(x => x.Children).Distinct().ToList().First(x => x.identify == 'P'); //Location Parent

    App.Current.Dispatcher.BeginInvoke((Action)delegate()
    {
        node.Children.Add(CreateLocationNode(displayName, locationValue));
    });
}

CreateLocationNode:

//Also location in MainTreeViewModel
private HierarchicalVM CreateLocationNode(MultiItemString displayName, int locationValue)
{
    MultiItemString locationNumber = new MultiItemString(new[] {locationValue.ToString() + " "}, false);

    var newLocationNode = new HierarchicalVM()
    {
        DisplayName = displayName, //Examples of props that turn out as NULL
        LocationNumber = locationNumber,
        TreeView_LocValue = locationValue,
        Children = new ObservableCollection<HierarchicalVM>(), //This is what is being added to
        Commands = 
    };

        return newLocationNode;
}

执行此操作时,我发现添加了一个对象,但附加到它的所有属性都会收到空值。相反,当我在UI线程中执行所有操作并且只使用node.Children.Add(CreateLocationNode(displayName, locationValue));时,所有内容都会附加它应该如何。为什么我在这里得到不同的结果,我该如何解决?

如果您需要更多代码,请与我们联系。

0 个答案:

没有答案