Привязка к самому объекту не обновляется при изменении отдельных свойств

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

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

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

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

Всего 3 ответа


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


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

Та же самая ситуация произошла в коде ниже, где отдельные свойства, чтобы уведомить об изменении, не обновили всю привязку экземпляра, как найдено в 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, а затем установите его обратно.


Вы можете использовать реализацию 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> для каждого свойства.


Это было слишком легко - просто нужно было добавить свойство

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

тогда я могу связать

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

и тогда я могу позвонить откуда угодно

OnPropertyChanged("Self");

Есть идеи?

10000