2011-12-08 7 views
1

私はINotifyPropertyChangedイベントを使用してTextBlockをバインドしようとしています。しかし、TextBlockには何も更新されていません。 TextBlockは空白です。私の目標は、異なる行に表示されるアイテムのステータスを更新することです。ステータスに基づいてTextBlockのテキストと色を更新する必要があります。バインディングとINotifyPropertyChanged

私のコードで何が間違っているのか教えていただけますか?

public class ItemStatus : INotifyPropertyChanged 
{ 
    string itemStatus; 
    Brush itemStatusColor; 

    public string ItemStatus 
    { 
     get { return itemStatus; } 
     set 
     { 
      itemStatus = value; 
      this.OnPropertyChanged("ItemStatus"); 
     } 
    } 

    public Brush ItemStatusColor 
    { 
     get { return itemStatusColor; } 
     set 
     { 
      itemStatusColor = value; 
      this.OnPropertyChanged("ItemStatusColor"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    void OnPropertyChanged(string propName) 
    { 
     if (this.PropertyChanged != null) 
      this.PropertyChanged(
       this, new PropertyChangedEventArgs(propName)); 
    } 
} 

public class Items 
{ 
    List<ItemStatus> currentItemStatus; 

    public List<ItemStatus> CurrentItemStatus 
    { 
     get { return currentItemStatus; } 
     set { currentItemStatus = value; } 
    } 
} 

public partial class DisplayItemStatus : Page 
{ 
    .... 
    .... 

    public DisplayItemStatus() 
    { 
     foreach (Product product in lstProductList) 
     { 
      TextBlock tbItemStatus = new TextBlock(); 
      .... 

      Items objItems = new Items(); 

      Binding bindingText = new Binding(); 
      bindingText.Source = objItems; 
      bindingText.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 
      bindingText.Path = new PropertyPath(String.Format("ItemStatus")); 
      tbItemStatus.SetBinding(TextBlock.TextProperty, bindingText); 

      Binding bindingColor = new Binding(); 
      bindingColor.Source = objItems; 
      bindingColor.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 
      bindingColor.Path = new PropertyPath(String.Format("ItemStatusColor")); 
      tbItemStatus.SetBinding(TextBlock.ForegroundProperty, bindingColor); 

      grdItemsList.Children.Add(tbItemStatus); 
     } 
    } 

    private void UpdateItems_Click(object sender, MouseButtonEventArgs e) 
    { 
     int intCount = 0; 

     List<Product> ProductList = new List<Product>(); 
     List<ItemStatus> ItemList = new List<ItemStatus>(); 

     ProductList = GetProducts(); 
     foreach (Product product in ProductList) 
     { 
      intCount++; 
      UpdateStatus(intCount, ItemList); 
     } 
    } 

    public void UpdateStatus(int intIndex, List<ItemStatus> ItemList) 
    { 
     ItemStatus status = new ItemStatus(); 
     status.ItemStatus = strOperationStatus; 
     status.ItemStatusColor = brshForegroundColor; 
     ItemList.Add(status); 
    } 
} 
+0

あなたは、項目のリストを持っていて、それらを表示するためのTextBlockを使用していますか?なぜListBoxを使用しないのですか? – MBen

+2

多くのC#とXAMLはありません...あなたは自分自身にとって困難なものになっています。 –

答えて

2

ここで特に問題となるのは、TextBlockをItemStatusではなくItemにバインドしていることです。しかし、やっていることも難しいことです.XAMLのバインディングの詳細を実際に実行する必要があります。あなたのビューモデルからItemStatusのコレクションを公開し、コレクションにItemsSourceがバインドされたListBoxなどを持っています。次に、TextBlockとItemStatusへのバインディングを定義するDataTemplateが必要になります。

Here's a good walkthrough for it in general

+0

ありがとうございます。私はWPFの初心者です。実際に私は多くのコードをスキップしなければなりませんでした。したがって、現在のロジックごとに、私はTextBlockを動的に作成しなければなりませんでした。私は他の選択肢がありませんでした。また、ステータスはバックグラウンドプロセスによって更新されています。あなたが提供したリンクが役立つと思います。あなたが提案したようにDataTemplateを使用できるかどうか試してみましょう。 – Bian

+0

GRAND USERさん、ありがとうございました。あなたが私に提供したリンクはとても役に立ちました。私はDataTemplate、DataTriggers、およびItemsControlを使用しています。 DataTemplateを使用するためにコード内で多くを変更する必要がありました。しかし、それは私を多く助けました。 – Bian

関連する問題