直接绑定到Observable集合中的元素时要通知的正确属性名称是什么?

时间:2014-01-21 18:31:43

标签: xaml data-binding windows-phone-8

我在XAML中绑定了以下表单,

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));
                    }
                }
            }
        }

1 个答案:

答案 0 :(得分:1)

嗯,我不能确切地说你的代码出错了(因为我只看到它的一部分),但也许你没有设置你的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可以工作,所以它可能对你有帮助。