INotifyPropertyChanged实现,绑定不工作

本文关键字:工作 绑定 实现 INotifyPropertyChanged | 更新日期: 2023-09-27 18:02:26

我正在学习为WP7(芒果)创建一个应用程序,不知何故有这个问题。这不是我的应用程序的实际代码,而是同一个问题的简化版本。我认为这主要是由于缺乏对绑定工作原理的深入理解。

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的任何调用都不会更新属性。如果我使用'Title'而不是'Title',它会工作,这会调用setter。

或者我真的应该使用'Title'?我没有学过很多c#,所以我对OOP的理解还不是很好。

INotifyPropertyChanged实现,绑定不工作

setter中的下面一行通知观察者值已经改变:

OnPropertyChanged("Title");

当你使用私有字段值时,该方法不会被调用,所以观察者不会被通知属性的值已经改变。

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

是的,你必须使用Title作为Title只是设置字段而Title运行setter引发事件