我正在使用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中的项目没有改变。
我做错了什么? 如何获得更新的列表框?
答案 0 :(得分:0)
由于您的DisplayIndex是计算属性NameIndex
,因此当其值因其他属性发生更改而更改时,您需要调用OnPropertyChanged("NameIndex")
,例如:
public string Name
{
get
{
return name;
}
set
{
name = value;
OnPropertyChanged("Name");
OnPropertyChanged("NameIndex");
}
}
答案 1 :(得分:0)
使用 Profiles.ResetBindings()再次绑定它。