WPF - Проблема привязки - PullRequest
       3

WPF - Проблема привязки

0 голосов
/ 21 декабря 2010

Почему после нажатия кнопки текст в текстовом блоке не изменяется?

XAML:

 <Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>

    <TextBlock Text="{Binding Name}"/>
    <Button Click="Button_Click" Grid.Row="1" Margin="20">Click Me</Button>
</Grid>

Код позади:

  public partial class Window1 : Window, INotifyPropertyChanged
{
    private Person _myPerson;
    public Person MyPerson
    {
        get { return _myPerson; }
        set
        {
            _myPerson = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("MyPerson"));
            }
        }
    }

    public Window1()
    {
        MyPerson = new Person { Name = "A" };
        DataContext = MyPerson;
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        MyPerson = new Person { Name = "B" };
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion
}

Ответы [ 3 ]

1 голос
/ 21 декабря 2010

Измените

<TextBlock Text="{Binding Name}"/>

на

<TextBlock Text="{Binding MyPerson, Path=Name}"/>

Поскольку вы привязываете к имени, NotifyPropertyChanged не будет запускаться по имени при изменении MyPerson, и представление не будет обновляться.

1 голос
/ 21 декабря 2010
<TextBlock Text="{Binding Name}"/>

В приведенном выше коде вы связываете свойство Name с текстовым полем и в следующем коде:

private void Button_Click(object sender, RoutedEventArgs e)
{
    MyPerson = new Person { Name = "B" };
}

Вы установили MyPerson для нового человека.

Это предназначено? И реализует ли Person class INotifyPropertyChanged событие?

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

MyPerson = new Person { Name = "A" };

в конструкторе. Вам также необходимо обновить DataContext.

Вместо этого используйте следующий код:

private void Button_Click(object sender, RoutedEventArgs e)
{
    MyPerson = new Person { Name = "B" };
    DataContext = MyPerson;
}    
0 голосов
/ 21 декабря 2010

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

Или Вы можете повторно применить созданный объект к DataContext, иначе он не будет работать

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