2011-07-19 22 views
1

私は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に対する私の理解はそれほど素晴らしいものではありません。

ありがとうございます。

答えて

5

イベント発生させセッター走るのに対し、タイトルを使用する必要があります。

OnPropertyChanged("Title"); 

プライベートフィールドの値を使用する場合、そのメソッドは呼び出されていないため、プロパティの値が変更されたことをオブザーバに通知されません。

このため、オブザーバーに通知するには、プロパティーを使用する必要があります。 OnPropertyChanged("Title");行をGenerateTitle()メソッドに追加することもできますが、プロパティを使用することをお勧めします。

+0

ありがとうございます。しかし、この問題を理解するために、プロパティ 'Title'をバックアップする以外は、プライベートフィールド' title'の使用は何ですか?一般的な経験則では、それを定義するクラス内のプロパティを使用しますか?私は公共財産は授業外にアクセスして、内部のものにフィールドを使用する必要があると考えました。再度、感謝します。 –

+0

タイトルフィールドは、プロパティのバッキングストアを提供します。 .NETでは、プロパティは公式フィールドへのアクセスのように構文的に見えるが、カバーメソッドの下でメソッドが実行される形式化されたメソッドのペアです。メソッドが操作する状態は、どこかに格納する必要があります - それはタイトルです。タイトルはメソッドの定義です。クラス内では、必要な効果をもたらす構造を使用します。通知を行わずに変更を加えたい場合は、フィールドを変更してください。通知を発行する変更を加える場合は、プロパティを使用します –

1

はい、あなたのタイトルだけのフィールドを設定してタイトルがセッターに次の行は、彼値が変更されたことをオブザーバーに通知するものである

関連する問題