INotifyPropertyChanged实现,绑定不起作用

Shu*_*pli 1 c# data-binding inotifypropertychanged windows-phone-7

我正在学习为WP7(芒果)创建一个应用程序,并以某种方式解决这个问题.这不是我的应用程序的实际代码,而是同一问题的简化版本.我认为主要是因为缺乏对绑定如何运作的深刻理解.

XAML.

<TextBlock x:Name="PageTitle" Text="{Binding Title}" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
Run Code Online (Sandbox Code Playgroud)

代码背后.

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();
    }
Run Code Online (Sandbox Code Playgroud)

和我的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++;
    }
Run Code Online (Sandbox Code Playgroud)

问题是,它只在我的ViewModel构造函数中更新绑定,所以标题是"Init".

对GenerateTitle的任何调用都不会更新属性.如果我使用'Title'代替'title',它会调用setter.

或者我应该使用'标题'?我没有做太多的C#,所以我对OOP的理解还不是很好.

提前致谢.

Jus*_*ner 5

setter中的以下行是通知观察者他的值已经改变:

OnPropertyChanged("Title");
Run Code Online (Sandbox Code Playgroud)

当您使用私有字段值时,不会调用该方法,因此不会通知观察者属性的值已更改.

因此,如果您希望通知观察者,则需要使用该属性.您也可以在方法中添加该OnPropertyChanged("Title");GenerateTitle(),但我建议您只使用该属性.