Wpf - проблема с привязкой к элементу коллекции - PullRequest
0 голосов
/ 18 ноября 2010

это мой простой xaml, который показывает в текстовом поле возраст первого человека в группе людей. Я не понимаю, что после клика возраст не меняется.

 <Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="132*" />
        <RowDefinition Height="179*" />
    </Grid.RowDefinitions>
    <TextBlock Text="{Binding Persons[0].Age}" />
    <Button Grid.Row="1" Click="Button_Click">Change Age</Button>
</Grid>

это код позади xaml:

 public partial class MainWindow : Window
{
    public ObservableCollection<Person> Persons { get; set; }

    public MainWindow() {
        Persons = new ObservableCollection<Person>();
        Persons.Add(new Person{Age = -1});

        DataContext = this;
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e) {
        (Persons[0] as Person).Age = 5;
    }
}

это классный человек:

 public class Person : INotifyPropertyChanged
{
    private int _age;

    public int Age
    {
        get { return _age; }
        set
        {
            _age = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("Age"));
            }
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion
}

Ответы [ 3 ]

1 голос
/ 18 ноября 2010

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

private void Button_Click(object sender, RoutedEventArgs e) {

    (Persons[0] as Person).Age = 5;
    Person p = Persons.First();
    Persons.Remove(0);
    Persons.Add(p);
}
0 голосов
/ 18 ноября 2010

Я попробовал твой код, и он отлично сработал для меня.Я даже изменил обработчик нажатия кнопки, чтобы продолжать нажимать и видеть обновление TextBlock.

private void Button_Click(object sender, RoutedEventArgs e)
{
    (Persons[0] as Person).Age = (Persons[0] as Person).Age + 1;
}
0 голосов
/ 18 ноября 2010

Ваш код правильный, вы внедрили INotifyPropertyChanged в своем классе, поэтому все должно быть хорошо.

Вы уверены, что оно не меняется?

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