【问题标题】:why my ObservableCollection is not refreshed in the ListBox?为什么我的 ObservableCollection 没有在 ListBox 中刷新?
【发布时间】:2012-07-01 11:09:26
【问题描述】:

我的代码有问题。我使用列表框和可观察集合将数据添加到列表中。代码如下所示:

ListData actualData;
ObservableCollection<ListData> data;

public Calculate()
{
    InitializeComponent();

    data = new ObservableCollection<ListData>();
    newData();

    listbox1.ItemsSource = data;
}

private void newData()
{
    actualData = new ListData("1", "2", "3");
    data.Add(actualData);
}

现在,我有一个按钮,例如,更改 actualData 但我看不到列表中的更改。

按钮看起来像:

private void button1_Click(object sender, RoutedEventArgs e)
{
    actualData.first = "12";
}

我找到了解决方法:

listbox1.ItemsSource = null;
listbox1.ItemsSource = data;

但这不是一个好的解决方案,这里有什么问题?

【问题讨论】:

    标签: c# silverlight windows-phone-7


    【解决方案1】:

    ObservableCollection 只会在列表中有活动而不是列表项时通知。列表上的活动意味着添加/删除列表中的项目。您需要对 ListData 类实现 INotifyPropertyChange 接口,以通知 ListData 类属性/成员的更改。

    【讨论】:

    • INotifyPropertyChanged 也有效 - 我开始想知道有什么区别......啊,显然它在 .NET 中被删除了 - bytes.com/topic/c-sharp/answers/270938-ipropertychange
    • 是的,我的意思是,但写错了IPRopretyChange。没有这样的接口 IPropertyChange :)
    • 没有问题,无论如何你都会从我这里得到 +1 :D
    【解决方案2】:

    正如 ZafarYousafi 在他的回答中正确指出的那样,ObservableCollection&lt;T&gt; 只会通知添加和删除项目的列表;如果您更改其中一项的属性,它不会在列表中更新。

    相反,您需要更改 ListData 类的定义,如下所示:

    public class ListData : INotifyPropertyChanged
    

    这需要你的类实现PropertyChanged 事件:

    public event PropertyChangedEventHandler PropertyChanged;
    

    现在,您需要做的就是更改first 的定义(编码约定规定属性应以大写字母开头,PascalCase):

    private string first;
    public string First
    {
        get { return first; }
        set
        {
            first = value;
            var handler = PropertyChanged; //according to Essential C# (M. Michaelis) 
            if (handler != null)           //the copy should prevent threading issues
            {                              
                handler(this, new PropertyChangedEventArgs("First"));
            }
        }
    }
    

    顺便说一句:我对必须将属性名称作为字符串传递感到不舒服。如需更复杂的解决方案,请参阅this tutorial

    【讨论】:

    猜你喜欢
    • 2012-08-03
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多