我正在学习为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。
或者我应该使用'标题'?我没有做太多的C#,所以我对OOP的理解还不是很好。
答案 0 :(得分:5)
setter中的以下行是通知观察者他的值已经改变的原因:
OnPropertyChanged("Title");
当您使用私有字段值时,不会调用该方法,因此不会通知观察者属性的值已更改。
因此,如果您希望通知观察者,则需要使用该属性。您也可以在OnPropertyChanged("Title");
方法中添加GenerateTitle()
行,但我建议您只使用该属性。
答案 1 :(得分:1)
是的你必须使用Title作为标题才设置字段,而Title运行引发事件的setter