2012-03-22 5 views
1

時間の経過とともに更新される一連のデータを表示するリストボックスを作成しようとしています。私は、単純なリストボックスがあります。INotifyPropertyChanged何が実装されましたか?

<ListBox Name="lbRegisters" ItemsSource="{Binding}" /> 

をそして私は私のオブジェクトのクラスを定義しています

public class register : INotifyPropertyChanged 

{ 
    private int address; 
    public int Address { get { return address; } } 

    private int value; 
    public int Value 
    { 
     get{ return value; } 
     set{ 
      this.value = value; 

      OnValueChanged("Value"); 
     } 
    } 

    public register(int a) 
    { 
     address = a; 
     value = 0; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnValueChanged(string name){ 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 

    public override string ToString() 
    { 
     return address + ": " + value; 
    } 
} 

そして私はのObservableCollection <レジスタ>にこれらのリストを保持します。次に、ListBox.ItemsSource = registerslistを設定します。コードビハインドで。リストが初期化され、初期データが正しく表示されます。

"register.Value"が変更されたときにListBoxを更新するには、どうすればよいですか。イベントハンドラは呼び出されますが、イベントには何も登録されていません。

GUIを更新するようにするには、ListBoxまたはObservableCollectionで何かをトリガーする必要があると思います。私は同様の問題の投稿数十を読んだが、それらはすべてあなたがINotofyPropertyChangedを実装したばかりであれば、それはただ自動的に動作することを示しているようだ。

次のステップは何ですか?

+0

未完成の質問のようです。 –

答えて

3

問題はToString()の機能にあります。はい、ListViewアイテムに複雑な文字列を表示するために使用できますが、ListViewはこの文字列の一部が変更されたときを認識しないため、バインディングには適切な方法ではありません。

次の操作を行います

public string AddressValue 
    { 
     get { return address + ": " + value; } 
    } 

2のようなregisterクラスの
1.宣言プロパティのようなvalueOnValueChanged("AddressValue")addressセッターを追加します:あなたはItemTemplateにとリストボックス

public int Value 
{ 
    get{ return value; } 
    set{ 
     this.value = value; 

     OnValueChanged("Value"); 
     OnValueChanged("AddressValue") 
    } 
} 

3.宣言like:

<ListBox x:Name="lbRegisters" ItemsSource="{Binding}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
        <TextBlock Text="{Binding AddressValue}" /> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

registerクラスに新しいプロパティを追加し、addressvalueが変更されたときに更新されるという考えです。リスト項目テキストをこのプロパティにバインドします。

-1

私はあなたが尋ねていることの精神を理解していると思います(明らかに未完成のATMですが)。 DependencyObjectから継承し、依存関係プロパティを使用することをお勧めします。 Visual Studioでpropdpスニペットを使用します。それは、定型コードと配線のトンを節約します。