【问题标题】:INotifyPropertyChanged implementation, binding does not workINotifyPropertyChanged 实现,绑定不起作用
【发布时间】:2011-07-19 14:17:57
【问题描述】:

我正在学习为 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 的任何调用都不会更新该属性。如果我使用'Title'而不是'title',它会调用setter。

或者我真的应该使用“标题”? C#我没怎么学过,所以对OOP的理解还不是很好。

【问题讨论】:

    标签: c# data-binding windows-phone-7 inotifypropertychanged


    【解决方案1】:

    setter 中的以下行用于通知观察者他的值已更改:

    OnPropertyChanged("Title");
    

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

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

    【讨论】:

    • 谢谢。但是为了理解这个问题,私有字段title除了备份属性Title有什么用?对于一般的经验法则,您会在定义它的类中使用任何属性吗?我认为公共属性应该只用于访问类外部,并将字段用于内部的任何内容。再次感谢。
    • 标题字段为属性提供后备存储。在 .NET 中,属性是一对形式化的方法,在语法上看起来像访问公共字段,但在幕后执行方法。方法操作的状态必须存储在某个地方——这就是标题。标题是方法的定义。在类中,您使用可以为您提供所需效果的构造。如果您想在不发出通知的情况下进行更改,请更改该字段。如果您想进行更改以引发通知,请使用该属性
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-07-04
      • 2011-06-08
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 2021-10-02
      相关资源
      最近更新 更多