2012-05-06 14 views
7

私は、インターネット上でバインディングについて見つけたすべての例が、INotifyPropertyChangedインターフェイスを継承し、クラスのプロパティの設定部分のメソッドを使用するクラス(別のプロパティにバインドするクラス)を持っていることに気付きました。なぜWPFのバインディングでINotifyPropertyChangedを使用するのですか?

私はバインディングの例からその部分を削除しようとしましたが、メソッドと同じように動作しました。

例を示します。私はそれを変更してTwoWayバインディングモードになり、変更されたプロパティをメッセージボックスに表示します。

は、私はちょうどバインディングと少し周りを再生するには、今、私は本当にそのインターフェイスが使用されている理由がわからないということでした

EDIT

XAML:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="30"/> 
      <RowDefinition Height="30"/> 
      <RowDefinition Height="30"/> 
      <RowDefinition Height="30"/> 
      <RowDefinition Height="30"/> 
      <RowDefinition Height="40"/> 
      <RowDefinition Height="30"/> 
      <RowDefinition Height="30"/> 
      <RowDefinition Height="30"/> 
      <RowDefinition Height="30"/> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="100"/> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="30"/> 
     </Grid.ColumnDefinitions> 
     <Button Grid.Row="5" Grid.Column="5" Name="btnBinding" Click="btnBinding_Click" Width="100" Height="30"> 
      <Grid HorizontalAlignment="Left" VerticalAlignment="Center"> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="25"/> 
       </Grid.RowDefinitions> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="50"/> 
        <ColumnDefinition Width="50"/> 
       </Grid.ColumnDefinitions> 
       <TextBox Name="txtBinding" Width="30" Height="25" HorizontalAlignment="Left"/> 
       <Label Grid.Column="1" Content="Bind"/> 
      </Grid> 
     </Button> 
     <Button Grid.Column="5" Grid.Row="6" Name="btnMessage" Click="btnMessage_Click" Content="MessageBox"/> 
     <Button Grid.Column="5" Grid.Row="4" Name="btnChangeproperty" Click="btnChangeproperty_Click" Content="Change Property"/> 
    </Grid> 
</Window> 

Main.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     Binding bind; 
     MyData mydata; 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void btnBinding_Click(object sender, RoutedEventArgs e) 
     { 
      mydata = new MyData("T"); 
      bind = new Binding("MyDataProperty") 
      { 
       Source = mydata, 
       Mode = BindingMode.TwoWay 
      }; 

      txtBinding.SetBinding(TextBox.TextProperty, bind); 
     } 

     private void btnMessage_Click(object sender, RoutedEventArgs e) 
     { 
      MessageBox.Show(mydata.MyDataProperty); 
     } 

     private void btnChangeproperty_Click(object sender, RoutedEventArgs e) 
     { 
      mydata.MyDataProperty = "New Binding"; 
     } 
    } 
} 

MyData cla SS:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.ComponentModel; 

namespace WpfApplication1 
{ 
    public class MyData 
    { 
     private string myDataProperty; 

     public MyData() { } 

     public MyData(DateTime dateTime) 
     { 
      myDataProperty = "Last bound time was " + dateTime.ToLongTimeString(); 
     } 

     public MyData(string teste) 
     { 
      myDataProperty = teste; 
     } 

     public String MyDataProperty 
     { 
      get { return myDataProperty; } 
      set 
      { 
       myDataProperty = value; 
       OnPropertyChanged("MyDataProperty"); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     private void OnPropertyChanged(string info) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(info)); 
      } 
     } 
    } 
} 

答えて

17

(あなたが見出したよう)あなたが唯一の財産に書き込みへの結合を使用する場合は、INotifyPropertyChangedは必要ありませんが、あなたはことを伝えることができるようにあなたがそれを必要としません他の誰かがプロパティに書き込んで、それに応じて表示値を更新します。

私が話していることを見るには、クリックすると直接バインドされたプロパティの値が変更されます(ではなく、そのプロパティにバインドされたUI要素の対応する属性)。 INotifyPropertyChangedを使用すると、ボタンをクリックするとUIが新しい値に更新されます。それがなければ、UIは "古い"値を表示します。

+0

でご覧いただけます。その答えをありがとうございました。それは本当に私を助けました。私は5分で正解とマークします。 stackoverflowが私に質問に答えをつけさせないので、私はそれらの5分を必要とします – morcillo

+0

@morcillo:喜んで助けてください。乾杯! – Jon

+0

OK私はそれをして、それが動作しなかったので、答えとしてマークすることはできません。私はコメントを外しました(この単語が正しいかどうかはわかりませんが、英語は私の母国語ではありません)。Inotifyの部分はうまくいきました。もしあなたが望むなら、私はあなたに私がしたことを送ることができます。それは本当に簡単です。バインディングの値を表示するテキストボックス、それを変更するボタン、およびメッセージボックスに表示するボタン。メッセージボックスは機能していますが、テキストボックスは更新されません – morcillo

0

ここでの議論から、私はあなたがそれをあなたはUIが自動的に更新されていることを見ることができます実装されたら

RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(“Propety Name”)) 

を実装逃したと思います。 詳細は、MSDNまたはmy blog here.

関連する問題