Обновление привязки содержимого при смене свойства - PullRequest
3 голосов
/ 13 августа 2010

У меня есть такой ярлык:

<Label Name="LblUsersWithHair">
    <Binding Path="Users" 
             ElementName="ElementSelf" 
             Converter="{StaticResource Converter_UsersWithHairPresenter}" />
</Label>

И конвертер:

...

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    var users = value as ObservableCollection<Users>;
    if (users == null) return null;

    var usersWithHair = users.Count(user => user.HasHair == true);
    return "There are " + usersWithHair + " there has hair.";
}

...

Теперь проблема в том, что метка, конечно, не обновляется при изменении свойства HasHair, поскольку коллекция не изменяется.Но как заставить ярлык перепривязать, когда это свойство установлено?

Пример выше очень упрощен, но надеюсь, что вы мне поможете ...: o)

Ответы [ 3 ]

2 голосов
/ 13 августа 2010

Вам необходимо реализовать INotifyPropertyChanged в своем классе Users для свойства HasHair.

Проверьте это сообщение Как заставить ListBox перезагрузить свойства ListBoxItems

1 голос
/ 13 августа 2010

Ваша привязка будет обновляться только в том случае, если список запускает событие ListChanged. Обычно это происходит только при структурных изменениях (добавление / удаление / замена) в списке, а не при изменении одного элемента списка, даже если он реализует INotifyPropertyChanged. После того, как вы реализовали INotifyPropertyChanged для своего элемента, вам все равно нужно будет выполнить один из следующих двух вариантов:

  • Используйте модифицированную коллекцию ObservableCollection, которая прослушивает событие PropertyChanged любого элемента внутри (зарегистрироваться при добавлении / удалении) и запускает ListChanged при любом изменении.
  • Создайте CollectionViewSource с предикатом фильтра, который оценивает HasHair, затем привяжите вашу метку к количеству элементов этого CollectionViewSource вместо исходного списка.
0 голосов
/ 13 августа 2010

Майк, скорее всего, в створ.Фреймворку нужен какой-то способ узнать, когда свойство изменилось, и INPC (INotifyPropertyChanged) существует именно по этой причине.Я говорю, скорее всего, правильно, потому что в этой ситуации вы используете ObservableCollection, в которую встроен INPC, и я предполагаю, что вы добавляете / вычитаете из списка на основе того, что пользователь проверяет что-то привязанное к HasHair.Пожалуйста, опубликуйте свой код и то, что, по вашему мнению, должно происходить, если у вас все еще есть проблемы.

Пока вы в нем, вы можете сократить объявление этой метки до:

<Label Content="{Binding Users, Converter={StaticResource Converter_UsersWithHairPresenter}"/>

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

HTH,
Berryl

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...