gpt4 book ai didi

c# - INotifyPropertyChanged 实现,绑定(bind)不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 19:28:30 25 4
gpt4 key购买 nike

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

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 构造函数中更新一次绑定(bind),所以标题是“Init”。

对 GenerateTitle 的任何调用都不会更新该属性。如果我使用“标题”而不是调用 setter 的“标题”,它就会起作用。

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

最佳答案

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

OnPropertyChanged("Title");

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

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

关于c# - INotifyPropertyChanged 实现,绑定(bind)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6748647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com