C# 在WPF中使用新的DataContext刷新列表时如何防止Expander listitem崩溃

C# 在WPF中使用新的DataContext刷新列表时如何防止Expander listitem崩溃,c#,wpf,C#,Wpf,我列出了WPF中的扩展器列表。列表绑定到一个对象数组,我需要定期更新它们 在我展开列表中的一个扩展器后,通过从DB读取对象来更新对象数组时,扩展器会自动折叠 有没有办法防止这种情况发生 编辑1 这是ObjectTab的xml部分 <ListView x:Name="list" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" ItemsSource="{Binding Path=Objects}"

我列出了WPF中的扩展器列表。列表绑定到一个对象数组,我需要定期更新它们

在我展开列表中的一个扩展器后,通过从DB读取对象来更新对象数组时,扩展器会自动折叠

有没有办法防止这种情况发生

编辑1

这是ObjectTab的xml部分

<ListView x:Name="list" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" ItemsSource="{Binding Path=Objects}" ScrollViewer.CanContentScroll="False">
    <ListView.ItemTemplate>
        <DataTemplate>
            <local:ObjectRealtimeControl></local:ObjectRealtimeControl>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
ObjectRealtimeControl包含Expander,以及表示某个对象类的其他控件。

您没有提供问题的详细信息,因此很难说关于您的Expander的任何内容,而是为
对象
属性本身引发
PropertyChanged
事件,您可以尝试更新每个对象的各个属性,或者清除同一集合并重新填充它。大概是这样的:

public partial class ObjectTab : UserControl
{
    public ObservableCollection<SomeObject> Objects { get; set; } = new ObservableCollection<SomeObject>();

    public ObjectTab()
    {
        DataContext = this;
        InitializeComponent();
        runWorker();
    }

    ...

    private void refreshAll()
    {

        Shared.DB.read("Some SQL", (ex, dataTable) =>
        {
            var newObjects = dataTable.AsEnumerable().Select((row) => {
                return new SomeObject()
                {
                    id = row[0].toString(),
                };
            }).ToArray();

            Dispatcher.BeginInvoke(new Action(() => 
            {
                Objects.Clear();
                foreach (var newObject in newObjects)
                    Objects.Add(newObject);
            }));
        };
    }
}
public分部类ObjectTab:UserControl
{
公共ObservableCollection对象{get;set;}=new ObservableCollection();
公共对象选项卡()
{
DataContext=this;
初始化组件();
runWorker();
}
...
私有void refreshAll()
{
Shared.DB.read(“一些SQL”,(例如,dataTable)=>
{
var newObjects=dataTable.AsEnumerable().Select((行)=>{
返回新的SomeObject()
{
id=行[0]。toString(),
};
}).ToArray();
Dispatcher.BeginInvoke(新操作(()=>
{
对象。清除();
foreach(newObjects中的var newObject)
添加(newObject);
}));
};
}
}

myExpander.IsExpanded=true;不起作用吗?@Smartis我认为它起作用,但我必须保持扩展的扩展器。我想保持代码简短,因为我没有太多时间。此外,对象可能会在数据库中被删除、添加或更新,因此可以动态更改对象数组。这样我就可以跟踪它们并更新我的Lis我不能手动操作,但我担心这会浪费时间。您没有提供任何代码来演示扩展器如何以及在何处“自动折叠”。很明显,您正在执行导致它们崩溃的操作。请阅读以下内容:@mm8好的。。这是我的代码,在第一次从DB读取后,列表显示的列表项是扩展器。我展开了其中一个列表项,但BackgroundWorker继续从DB读取并更新对象属性。更新对象属性后,所有扩展器都将进入列表已折叠。@Chickenchaser:那么您只是在更新现有对象的ID?定义转换对象的标记在哪里?
public partial class ObjectTab : UserControl
{
    public ObservableCollection<SomeObject> Objects { get; set; } = new ObservableCollection<SomeObject>();

    public ObjectTab()
    {
        DataContext = this;
        InitializeComponent();
        runWorker();
    }

    ...

    private void refreshAll()
    {

        Shared.DB.read("Some SQL", (ex, dataTable) =>
        {
            var newObjects = dataTable.AsEnumerable().Select((row) => {
                return new SomeObject()
                {
                    id = row[0].toString(),
                };
            }).ToArray();

            Dispatcher.BeginInvoke(new Action(() => 
            {
                Objects.Clear();
                foreach (var newObject in newObjects)
                    Objects.Add(newObject);
            }));
        };
    }
}