如何在WPF中使用新的DataContext刷新List时防止Expander listitem的折叠

时间:2018-05-08 08:03:28

标签: c# wpf

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

当我在扩展List中的一个Expanders后,通过从DB读取对象来更新对象数组时,Expander会自动折叠。

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

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

1 个答案:

答案 0 :(得分:0)

您尚未提供问题的Minimal, Complete, and Verifiable example,因此很难说出有关您的扩展器的任何信息,但您可以尝试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);
            }));
        };
    }
}