首页 > 解决方案 > 在 WPF 中使用新 DataContext 刷新列表时如何防止 Expander listitem 折叠

问题描述

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

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

有没有办法防止这种情况?

编辑 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>

ObjectTab 的代码是

public partial class ObjectTab : UserControl, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public SomeObject[] Objects { get; set; }

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

    // Create the OnPropertyChanged method to raise the event
    protected void OnPropertyChanged(string name)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }

    private void runWorker()
    {
            worker = new BackgroundWorker();
            worker.WorkerSupportsCancellation = true;
            worker.DoWork += Worker_DoWork;
            worker.RunWorkerAsync();
    }
    private void Worker_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;

        while (!worker.CancellationPending )
        {
            refreshAll();
            Thread.Sleep(1000);
        }
    }

    private void refreshAll()
    {

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

ObjectRealtimeControl 包含 Expander,其他控件代表 SomeObject 类。

标签: c#wpf

解决方案


您没有提供关于您的问题的最小、完整和可验证的示例PropertyChanged,因此很难对您的扩展器发表任何看法,但Objects您可以尝试更新每个对象的各个属性或清除相同的集合并重新流行它。像这样的东西:

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);
            }));
        };
    }
}

推荐阅读