Привязка к самому объекту не обновляется при изменении отдельных свойств - PullRequest
0 голосов
/ 09 февраля 2020

В списке у меня есть список объектов со многими свойствами, и, поскольку я рендерим все сразу и объект, который он генерирует c, я привязываюсь к самому объекту.

<local:ItemRenderer ItemReference="{Binding Path=."}/>

Проблема когда базовый объект обновляет одно из свойств, OnPropertyChanged не вызывает привязку для обновления. Есть ли способ вызвать привязку для обновления при изменении какого-либо из свойств?

Одна идея заключалась в том, чтобы иметь свойство только для уведомления, но базовый ObservableCollection - это тип Object, добавление BindingNotifier="{Binding Path=BindingNotifier"} - это не распознается и не будет работать.

РЕДАКТИРОВАТЬ

Это казалось хорошим решением, но оно не работает

public class MyObject : INotifyPropertyChanged {
    public MyObject Self
    {
        get { return this; }            
    }

тогда я пытаюсь связать

<local:ItemRenderer ItemReference="{Binding Self"}/>

Это работает для начальной привязки, но вызов

OnPropertyChanged("Self");

не обновляет объект.

Ответы [ 2 ]

2 голосов
/ 09 февраля 2020

Сбросьте текст данных элемента управления или представления или страницы или все, что необходимо * от 1002 * до null, затем верните его обратно к экземпляру, который был недавно изменен. Изменение его на ту же ссылку не работает ... Нужны оба шага .


Здесь приведен фактический код, в котором мне нужно, чтобы элементы управления запускались одинаково из-за на изменение команды (выполняемой из ВМ, чтобы сохранить операции ВМ и View отдельно) для обновления элементов управления Views в аналогичной ситуации.

Та же ситуация произошла в приведенном ниже коде, где отдельные свойства для уведомления об изменении не обновил всю привязку экземпляра, найденную на CurrentBatch. Другие элементы управления должны были быть обновлены, чтобы показать, что что-то в CurrentBatch изменилось ....

public MainWindow()
{
    DataContext = VM = new CertifyingVM();

    VM.CommandRefreshBindings = new OperationCommand(o =>
    {
        MainAccessionHeader.DataContext =
        MainHeader.DataContext = null;

        MainAccessionHeader.DataContext =
        MainHeader.DataContext = VM;

        var currentBatch = VM.CurrentBatch;
        MainAccessionHeader.CurrentBatch = null;
        MainAccessionHeader.CurrentBatch = currentBatch;

    });

    VM.LockBatchGui = new OperationCommand(o =>
    { ... }

OperationCommand - это моя операция ICommand, которая продемонстрирована в моем блоге под названием Xaml: MVVM-пример для более простого связывания .

То, как вы запускаете, зависит от вас, просто удалите значение datacontext в null, а затем установите его обратно.

1 голос
/ 10 февраля 2020

Вы можете использовать реализацию IMultiValueConverter и связывать как сам объект, так и свойство, которое изменяется всякий раз, когда изменяется любое свойство объекта:

public class TheConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return values[0]; //return the actual object
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

XAML:

<local:ItemRenderer>
    <local:ItemRendered.ItemsReference>
        <MultiBinding>
            <MultiBinding.Converter>
                <local:TheConverter />
            </MultiBinding.Converter>
            <Binding Path="." />
            <Binding Path="BindingNotifier" />
        </MultiBinding>
    </local:ItemRendered.ItemsReference>
</local:ItemRenderer>

Для этого необходимо установить свойство BindingNotifier всякий раз, когда изменяется любое свойство объектов. Другой вариант - добавить элемент <Binding> для каждого свойства.

...