Как предотвратить разрушение списка элементов Expander при обновлении списка с новым DataContext в WPF - PullRequest
0 голосов
/ 08 мая 2018

Я составил список расширителей в WPF. Список ограничен массивом объектов, и мне нужно периодически обновлять их.

Когда я обновляю массив объектов, читая их из БД после развертывания одного из Расширителей в Списке, Расширитель автоматически сворачивается.

Есть ли способ предотвратить это?

Редактировать 1

Это часть XML ObjectTab,

<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 голосов
/ 08 мая 2018

Вы не предоставили Минимальный, Полный и Проверяемый пример вашей проблемы, поэтому трудно сказать что-либо о ваших расширителях, но вместо того, чтобы вызывать событие 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);
            }));
        };
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...