C#BindingList<>没有更新已更改项目的WPF列表框

时间:2018-01-16 15:17:43

标签: c# wpf data-binding

我正在使用MVVM C#项目。

我想显示一个对象列表。 我想添加和删除此列表中的项目,并且还要更改此列表中的项目。

所以我选择了BindingList<>在ObservableCollection<>上,如果项目已更改,则不会被注意到。 (我还测试了Web中的ObservableCollectionEx,但这与我的BindingList具有相同的行为)。 但是更改项目时,列表框不会更改。 (添加和删除项目在列表框中更新)

在我的XAML中

<ListBox  DisplayMemberPath="NameIndex" ItemsSource="{Binding Profiles}" SelectedItem="{Binding SelectedProfile}">

或替代ItemTemplate

<ListBox  DockPanel.Dock="Right" ItemsSource="{Binding Profiles}" SelectedItem="{Binding SelectedProfile}" Margin="0,10,0,0">
   <ListBox.ItemTemplate>
       <DataTemplate>
           <TextBlock Text="{Binding NameIndex}"/>
       </DataTemplate>
   </ListBox.ItemTemplate>
</ListBox>

在我的ViewModel中(ViewModelBase正在实现INotifyPropertyChanged等)

public class ProfileListViewModel : ViewModelBase
{    
    private BindingList<Profile> profiles;
    public BindingList<Profile> Profiles
    {
        get
        {
            return profiles;
        }
        set
        {
            profiles = value;
            RaisePropertyChanged();
        }
    }

我的项目也在实现INotifyPropertyChanged,我在我的Setters中调用了OnPropertyChanged(“Name”)。

我的模特

public class Profile : INotifyPropertyChanged
{
    public Profile(){}

    public int ProfileID { get; set; }

    private string name;
    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
            OnPropertyChanged("Name");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

使用ViewModel连接视图(BindingList在View之前初始化)

ProfileListViewModel plvw= new ProfileListViewModel(message.Content);
var profileView = new ProfileListView(plvw);
profileView.ShowDialog();

在View.xaml.cs

public ProfileListView(ProfileListViewModel plvw)
{
    InitializeComponent();

    DataContext = plvw;
}

当我更改对象的名称时,我得到了我在ViewModel(Profiles.ListChanged += Profiles_ListChanged;)中订阅的ListChanged事件以进行测试但是ListBox中的项目没有改变。

我做错了什么? 如何获得更新的列表框?

2 个答案:

答案 0 :(得分:0)

由于您的DisplayIndex是计算属性NameIndex,因此当其值因其他属性发生更改而更改时,您需要调用OnPropertyChanged("NameIndex"),例如:

public string Name
{
    get
    {
        return name;
    }
    set
    {
        name = value;
        OnPropertyChanged("Name");
        OnPropertyChanged("NameIndex");
    }
}

答案 1 :(得分:0)

使用 Profiles.ResetBindings()再次绑定它。