Як змусити оновлення WPF для оновлення?


112

У мене є комбо-поле з джерелом елементів, що додається за допомогою простого прив'язки. Чи є спосіб оновити цю палітурку після завантаження комбінованого вікна?


1
Що ви маєте на увазі під простим зв’язуванням? Зазвичай при використанні прив'язки елемент керування повинен автоматично оновлюватися.
Ерно

12
Techee, без образи, але я вважаю, що НВ заслуговує на те, щоб його відповідь була прийнята ;-)
Дані

1
@Dani Я не впевнений, що Techee повертається колись - шість з половиною років відтоді, як він увійшов
The Lonely Coder

Відповіді:


198

Ви можете використовувати вирази, що зв'язують:

private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
    ((ComboBox)sender).GetBindingExpression(ComboBox.ItemsSourceProperty)
                      .UpdateTarget();
}

Але, як зауважив Blindmeis, ви також можете запускати сповіщення про зміни, якщо далі ваша колекція реалізується INotifyCollectionChanged(наприклад, реалізована в програмі ObservableCollection<T>), вона синхронізується, тому вам не потрібно нічого робити.


Здається, це не робить для мене нічого, використовуючи ListBox.
Джонатан Вуд

@JonathanWood: Ну, я не можу заробити, який у вас код, у тому числі, як виглядає ваша прив'язка. Чи в першу чергу спрацьовує палітурка?
НВ

56

якщо ви використовуєте mvvm, а ваш itemssource знаходиться у вашому vm. просто зателефонуйте INotifyPropertyChanged для своєї власності колекції, коли ви хочете оновити.

OnPropertyChanged("YourCollectionProperty");

7
Це найчистіший підхід імхо.
Еш

Це потрібно робити там, де це можливо, але слід зазначити, що це не завжди практично. Наприклад, якщо ви прив'язуєте до послідовного порту і хочете перевірити, чи він відкритий, закритий, швидкість передачі даних тощо, ви можете створити клас обгортки навколо послідовного порту, який реалізує INotifyPropertyChanged, але вам доведеться зберігати порт приватним цій обгортці і, таким чином, потрібно написати властивість та метод для всього цього порту, який ви використовуєте в іншому місці проекту, щоб гарантувати, що властивості, про які ви хочете повідомити, завжди проходять через обгортку
Assimilater

8
Крім того, я великий прихильник використання nameof(YourCollectionProperty)на відміну від буквального рядка. Це запобігає рефакторингу помилок і більш чітко визначає, що насправді призначено. Це, звичайно, там, де ви не можете використовувати CallerMemberNameатрибут, який є ще приємнішим
Assimilater

31

Щоб додати мої 2 центи, якщо ви хочете оновити джерело даних новим значенням вашого Control, вам потрібно зателефонувати UpdateSource()замість UpdateTarget():

((TextBox)sender).GetBindingExpression(ComboBox.TextProperty).UpdateSource();

1
Мені подобається ця відповідь краще.
Chopnut

8

Друга версія мультив'язування ...

private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
    BindingOperations.GetBindingExpressionBase((ComboBox)sender, ComboBox.ItemsSourceProperty).UpdateTarget();
}


0

Я отримував дані з бекенда та оновлював екран лише одним рядком коду. Це спрацювало. Не впевнений, навіщо нам реалізовувати інтерфейс. (windows 10, UWP)

    private void populateInCurrentScreen()
    {
        (this.FindName("Dets") as Grid).Visibility = Visibility.Visible;
        this.Bindings.Update();
    }

Це.Bindings.update () оновить усі прив’язки на екрані. FYI
Itzdsp

Я спробував це.Bindings.Update () в usercontrol в UWP, і його не існує.
Джеймс Еш

Так. І цього. Прив’язки досі не існує.
Джеймс Еш

2
Bindings.Update () доступний лише там, де використовуються складені прив'язки (x: Bind) ..., а компільовані прив'язки доступні лише у UWP
Marian Dolinský

Будь ласка, подивіться на коментар @ MarianDolinský. Схоже, вам потрібно зв’язати з
xaml
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.