2014-01-21 39 views
1

我有一個在XAML以下形式的結合,直接綁定到Observable集合中的元素時,要通知的正確屬性名稱是什麼?

Title="{Binding SelectedNewsItems[0].Title}" 

注意,它指的是一個特定的元素在SelectedNewsItems其是ObservableCollection。 (我有各種尺寸的九個按鈕的集合,每個風格和大小的不同,所以更標準ListView是不恰當的。)

當我重新分配SelectedNewsItems我提出一個PropertyChanged事件SelectedNewsItems,然而,這並不似乎會導致綁定更新單個綁定元素及其屬性。我曾嘗試以下,

public ObservableCollection<NewsItem> _selectedNewsItems; 
     public ObservableCollection<NewsItem> SelectedNewsItems 
     { 
      get 
      { 
       return this._selectedNewsItems; 
      } 
      set 
      { 
       if (this._selectedNewsItems != value) 
       { 
        this._selectedNewsItems = value; 
        this.NotifyPropertyChanged(); 
        for (int i = 0; i < this._selectedNewsItems.Count; i++) 
        { 
         this.NotifyPropertyChanged(String.Format("SelectedNewsItems[{0}].Content", i)); 
         this.NotifyPropertyChanged(String.Format("SelectedNewsItems[{0}].Title", i)); 
         this.NotifyPropertyChanged(String.Format("SelectedNewsItems[{0}].Id", i)); 
         this.NotifyPropertyChanged(String.Format("SelectedNewsItems[{0}].Image", i)); 
        } 
       } 
      } 
     } 
+0

只需調用NotifyPropertyChanged(「SelectedNewsItems」);(至少它適用於我)應該足夠了。 – Clemens

+0

此外,(afaik)PropertyChanged事件中不會有複合屬性名稱。 – Clemens

回答

1

嗯,我不能說exacly在您的代碼是錯誤的(因爲我看到的只是其中的一部分),但也許你沒有設置你的DataContex或別的東西。爲了研究的目的,我做了一個簡單的例子,它工作得很好。看看它,也許它會幫助你:
在XAML:

<Button x:Name="first" VerticalAlignment="Top" Content="{Binding SelectedNewsItems[0].Name}" Grid.Row="0"/> 
<Button x:Name="second" VerticalAlignment="Center" Content="{Binding SelectedNewsItems[1].Name}" Grid.Row="1"/> 

在後面的代碼(我把所有的代碼 - 是相當多的,但我不能猜測什麼是你的代碼錯誤):

public class NewsItem 
{ 
    private string name; 

    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 
} 

public partial class MainPage : PhoneApplicationPage, INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public void RaiseProperty(string property = null) 
    { 
     if (this.PropertyChanged != null) 
      this.PropertyChanged(this, new PropertyChangedEventArgs(property)); 
    } 

    private ObservableCollection<NewsItem> _selectedNewsItems = new ObservableCollection<NewsItem>(); 
    public ObservableCollection<NewsItem> SelectedNewsItems 
    { 
     get 
     { 
      return this._selectedNewsItems; 
     } 
     set 
     { 
      if (this._selectedNewsItems != value) 
      { 
       this._selectedNewsItems = value; 
       this.RaiseProperty(); 
       for (int i = 0; i < this._selectedNewsItems.Count; i++) 
       { 
        this.RaiseProperty(String.Format("SelectedNewsItems[{0}].Name", i)); 
       } 
      } 
     } 
    } 

    public MainPage() 
    { 
     NewsItem firstT = new NewsItem() { Name = "First" }; 
     NewsItem secondT = new NewsItem() { Name = "Second" }; 
     SelectedNewsItems.Add(firstT); 
     SelectedNewsItems.Add(secondT); 

     InitializeComponent(); 

     this.DataContext = this; 
     first.Click += first_Click; 
     second.Click += second_Click; 
    } 

    private void first_Click(object sender, RoutedEventArgs e) 
    { 
     NewsItem change = new NewsItem() { Name = "Changed by First" }; 
     SelectedNewsItems[1] = change; 
    } 

    private void second_Click(object sender, RoutedEventArgs e) 
    { 
     NewsItem change = new NewsItem() { Name = "Changed by Second" }; 
     SelectedNewsItems[0] = change; 
    } 
} 

當我點擊按鈕的bindigs工作,所以也許它會幫助你。

+0

謝謝,我的代碼開始工作,其他原因,我不是100%清楚。在任何情況下,它會在ObservableCollection被替換時觸發'ObservableCollection'和'PropertyChanged'事件進行更新。 (即,沒有必要使用循環)。 – Brendan

相關問題