2016-04-17 6 views
1

Предположим, у меня есть приложение MVVM с ListView элементов и текстовое поле, редактирующее свойство (Текст) выбранного элемента.Automatic INotifyPropertyChanged после изменения в представлении

<TextBox Text="{Binding SelectedItem.Text}"/> 
<ListBox ItemsSource="{Binding Items}" DisplayMemberPath="Text" SelectedItem="{Binding SelectedItem}" 

В моей модели ViewModel у меня есть ObservableCollection of Items. Каждый элемент реализует INotifyPropertyChanged и обладает требуемым свойством. Если изменить текст моего TextBox, список не обновляется, потому что у меня есть только свойство без уведомления:

public class Item : INotifyPropertyChanged 
{ 
    public string Text { get; set; } 
} 

Мой вопрос: Есть ли способ, чтобы обновить Text-свойство моего списка без использования PropertyChanged как это ?:

private string _Text; 
public string Text 
{ 
    ... 
    set 
    { 
    _Text = value; 
    PropertyChanged("Text"); 
    } 
} 

есть ли способ уволить PropertyChanged прямо с моей точки зрения после того, как изменили текст моего TextBox - или другой подход?

Благодарим за помощь!

+0

Где находится ваш 'TextBox'? Я вижу только «TextBlock». Почему невозможно создать событие PropertyChanged из модели просмотра? – dkozl

+0

Вернитесь к удаленному комментарию, который вы оставили ниже, и следуйте по ссылке, которую вы оставили. Затем прочитайте, что говорит этот ответ. Затем сравните это с классом 'Item' со свойством' Text'. Ответ смотрит вам в лицо. – slugster

+0

@dkozl: Я изменил TextBlock на TextBox ... моя ошибка. Без реализации INotifyPropertyChanged он работал без уведомления (смотрите здесь: http://stackoverflow.com/questions/7767218/why-does-the-binding-update-without-implementing-inotifypropertychanged). Теперь я внедрил INPC, и я не хочу добавлять уведомления о каждом свойстве моего проекта (это только минимальный пример). – Fruchtzwerg

ответ

0

Хорошо, я оставлю ответ вместо слегка загадочного комментария (который я сделал, потому что вы действительно учитесь лучше, если вы сами находите ответ, а не ложным ...).

previous link вы оставили состояния:

И если вы реализуете INotifyPropertyChanged, вы полную ответственность осуществлять уведомление об изменении в каждом инкубаторе свойств, который должен быть данные, связанные с пользовательским интерфейсом. В противном случае изменение не будет синхронизировано, как вы ожидали.

(Emphasis mine. Для завершения, вот ссылка, которая осталась с этим ответом: MSDN forums: Data binding without INotifyPropertyChanged).

Раньше вы полагались на поведение WPF по умолчанию, но когда вы реализуете INotifyPropertyChanged, вы эффективно говорите «Yo WPF !!» Я хочу быть конкретным и конкретным о том, что получает уведомление, так что поведение по умолчанию может сиденье сзади! ". Затем вам не удалось добавить уведомление о свойстве Text. Поэтому, согласно вашему решению о кодировании, привязка WPF больше не обнаруживает изменения свойств в этом классе, если вы специально не активируете их.

Лично я всегда реализую INotifyPropertyChanged, потому что изменения свойств по-прежнему уведомляются, даже когда значение изменяется с помощью кода (поскольку используемый PropertyDescriptor по умолчанию не обнаруживает этого). Кроме того, он дает мне возможность не уведомлять или уведомлять несколько свойств, если они меняются.

+0

Благодарим вас за ответ @slugster. Это очень четкое описание. Ссылка описывает, что WPF автоматически привязывается к PropertyDescriptor без INPC. В моем случае мне не нужно обнаруживать изменение Text-свойства вне кода. Есть ли способ или обходной путь для использования INPC для всего моего объекта и автоматического механизма WPF только для этого единственного текстового свойства? – Fruchtzwerg

+0

Нет, нет никакого способа сделать так. Использование INPC означает, что вы выполняете полный контроль. Вы можете оптимизировать процесс, хотя, проверьте [этот старый ответ] (http://stackoverflow.com/a/13720780/109702), который удаляет немного тяжелой работы (код в этом ответе был pre .Net 4.5 и CallerMemberName). Это также просто пример, вы можете расширить этот подход в кучу [разных способов] (http://blog.amusedia.com/2013/06/inotifypropertychanged-implementation.html). – slugster

+1

Спасибо за отличный ответ! Это был не тот ответ, который я хотел услышать для своего проекта ... но теперь я знаю, в чем проблема. – Fruchtzwerg