Реализация INotifyPropertyChanged, привязка не работает - PullRequest
1 голос
/ 19 июля 2011

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

XAML.

<TextBlock x:Name="PageTitle" Text="{Binding Title}" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>

Код позади.

private MainPageViewModel viewModel;

    // Constructor
    public MainPage()
    {
        InitializeComponent();
        this.Loaded += new RoutedEventHandler(MainPage_Loaded);
    }

    void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        viewModel = new MainPageViewModel();
        this.DataContext = viewModel;
    }

    private void ApplicationBarIconButton_Click(object sender, EventArgs e)
    {
        viewModel.GenerateTitle();
    }

И моя ViewModel.

        private static int counter = 0;

    private string title;
    public string Title
    {
        get { return title; }
        set
        {
            if (title != value)
            {
                title = value;
                OnPropertyChanged("Title");
            }
        }
    }

    public MainPageViewModel()
    {
        title = "Init";
    }

    public void GenerateTitle()
    {
        if (counter == 0)
            title = "0"; // Title = "0" will work fine.
        if (counter == 1)
            title = "1";

        counter++;
    }

Проблема в том, что оно обновляет привязку только один раз в моем конструкторе ViewModel, поэтому заголовок имеет значение «Init».

Любой вызов GenerateTitle не обновляет свойство.Это работает, если я использую «Заголовок» вместо «Заголовок», который вызывает сеттер.

Или я действительно должен использовать «Заголовок»?Я не очень много делал на C #, поэтому мое понимание ООП пока не столь велико.

Ответы [ 2 ]

5 голосов
/ 19 июля 2011

Следующая строка в установщике уведомляет наблюдателей об изменении значения:

OnPropertyChanged("Title");

Когда вы используете значение частного поля, этот метод не вызывается, поэтому наблюдатели небудучи уведомленным об изменении значения свойства.

Из-за этого вам необходимо использовать свойство, если вы хотите, чтобы наблюдатели были уведомлены.Вы также можете добавить строку OnPropertyChanged("Title"); в свой метод GenerateTitle(), но я бы порекомендовал просто использовать свойство.

1 голос
/ 19 июля 2011

Да, вы должны использовать Заголовок, так как заголовок просто устанавливает поле, тогда как Заголовок запускает установщик, который вызывает событие

...