Wpf 如何强制ListBox重新加载ListBoxItems的属性

Wpf 如何强制ListBox重新加载ListBoxItems的属性,wpf,data-binding,listbox,Wpf,Data Binding,Listbox,有没有办法,如何强制ObservableCollection对FireCollection进行更改 我有一个对象的ObservableCollectionListBoxitem source,因此每次我向集合添加/删除项时,ListBox都会相应地更改,但当我更改集合中某些对象的属性时,ListBox仍会呈现旧值 即使我确实修改了一些属性,然后向集合中添加/删除对象,也不会发生任何事情,我仍然会看到旧值 还有别的办法吗?我发现接口INotifyPropertyChanged,但我不知道如何使用它

有没有办法,如何强制ObservableCollection对FireCollection进行更改

我有一个对象的ObservableCollection
ListBox
item source,因此每次我向集合添加/删除项时,ListBox都会相应地更改,但当我更改集合中某些对象的属性时,ListBox仍会呈现旧值

即使我确实修改了一些属性,然后向集合中添加/删除对象,也不会发生任何事情,我仍然会看到旧值


还有别的办法吗?我发现接口INotifyPropertyChanged,但我不知道如何使用它。

修改集合中项目的属性不会触发集合本身的NotifyCollectionChanged-毕竟它没有更改集合


InotifyProperty已更改,您走在正确的轨道上。您需要在列表包含的类上实现该接口。因此,如果您的集合是“ObservableCollection”,请确保您的Foo类实现了INotifyPropertyChanged。

我同意Matt上面的评论。下面是一小段代码,演示如何实现INotifyPropertyChanged

=============
代码隐藏
=============

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Data;
using System.Windows.Documents;

namespace WpfApplication1
{   
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        Nicknames names;

        public Window1()
        {
            InitializeComponent();
            this.addButton.Click += addButton_Click;
            this.names = new Nicknames();
            dockPanel.DataContext = this.names;
        }

        void addButton_Click(object sender, RoutedEventArgs e)
        {
            this.names.Add(new Nickname(myName.Text, myNick.Text));
        }
}
public class Nicknames : System.Collections.ObjectModel.ObservableCollection<Nickname> { }

public class Nickname : System.ComponentModel.INotifyPropertyChanged
{
    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    void Notify(string propName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propName));
        }
    }

    string name;
    public string Name
    {
        get { return name; }
        set
        {
            name = value;
            Notify("Name");
        }
    }
    string nick;
    public string Nick
    {
        get { return nick; }
        set
        {
            nick = value;
            Notify("Nick");
        }
    }
    public Nickname() : this("name", "nick") { }
    public Nickname(string name, string nick)
    {
        this.name = name;
        this.nick = nick;
    }

    public override string ToString()
    {
        return Name.ToString() + " " + Nick.ToString();
    }
  }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Windows;
使用System.Windows.Data;
使用System.Windows.Documents;
命名空间WpfApplication1
{   
/// 
///Window1.xaml的交互逻辑
/// 
公共部分类Window1:Window
{
昵称;
公共窗口1()
{
初始化组件();
this.addButton.Click+=addButton\u Click;
this.names=新昵称();
dockPanel.DataContext=this.names;
}
void addButton\u单击(对象发送器,路由目标)
{
this.names.Add(新昵称(myName.Text,myNick.Text));
}
}
公共类昵称:System.Collections.ObjectModel.ObservableCollection{}
公共类昵称:System.ComponentModel.INotifyPropertyChanged
{
公共事件System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
无效通知(字符串名称)
{
if(PropertyChanged!=null)
{
PropertyChanged(这是新的System.ComponentModel.PropertyChangedEventArgs(propName));
}
}
字符串名;
公共字符串名
{
获取{返回名称;}
设置
{
名称=值;
通知(“名称”);
}
}
线痕;
公共字符串尼克
{
获取{return nick;}
设置
{
尼克=价值;
通知(“尼克”);
}
}
公共昵称():此(“名称”、“尼克”){}
公共昵称(字符串名称、字符串昵称)
{
this.name=名称;
this.nick=nick;
}
公共重写字符串ToString()
{
返回Name.ToString()+“”+Nick.ToString();
}
}
}
XAML

<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
    <DockPanel x:Name="dockPanel">
        <TextBlock DockPanel.Dock="Top">
        <TextBlock VerticalAlignment="Center">Name: </TextBlock>
        <TextBox Text="{Binding Path=Name}" Name="myName" />
        <TextBlock VerticalAlignment="Center">Nick: </TextBlock>
        <TextBox Text="{Binding Path=Nick}" Name="myNick" />
        </TextBlock>
        <Button DockPanel.Dock="Bottom" x:Name="addButton">Add</Button>
        <ListBox ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" />
    </DockPanel>
</Grid>

姓名:
尼克:
添加