私はWP7(マンゴー)用のアプリケーションを作成していて、何とかこの問題を抱えています。 これは私のアプリの実際のコードではなく、同じ問題の単純化されたバージョンです。私は主にバインディングがどのように働くかを深く理解していないためだと思う。INotifyPropertyChanged implentation、バインディングが機能しません
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コンストラクタ内でバインディングを1回更新するだけなので、タイトルは「Init」です。
GenerateTitleを呼び出すと、プロパティは更新されません。これはsetterを呼び出す 'title'の代わりに 'Title'を使用すると機能します。
本当に「タイトル」を使用する必要がありますか?私は多くのC#をやっていないので、OOPに対する私の理解はそれほど素晴らしいものではありません。
ありがとうございます。
ありがとうございます。しかし、この問題を理解するために、プロパティ 'Title'をバックアップする以外は、プライベートフィールド' title'の使用は何ですか?一般的な経験則では、それを定義するクラス内のプロパティを使用しますか?私は公共財産は授業外にアクセスして、内部のものにフィールドを使用する必要があると考えました。再度、感謝します。 –
タイトルフィールドは、プロパティのバッキングストアを提供します。 .NETでは、プロパティは公式フィールドへのアクセスのように構文的に見えるが、カバーメソッドの下でメソッドが実行される形式化されたメソッドのペアです。メソッドが操作する状態は、どこかに格納する必要があります - それはタイトルです。タイトルはメソッドの定義です。クラス内では、必要な効果をもたらす構造を使用します。通知を行わずに変更を加えたい場合は、フィールドを変更してください。通知を発行する変更を加える場合は、プロパティを使用します –