我试图在我的应用中实现MVVM模式,并且遇到数据绑定问题。一切都很好,直到我的集合中出现一个新项目绑定到ListBox。 ListBox只是没有更新,在我尝试点击该框后,抛出了有关ItemsControl的异常。
MainView.xaml
<Window.DataContext>
<ViewModel:MainViewModel/>
</Window.DataContext>
<ListBox x:Name="Scripts" ItemsSource="{Binding Scripts, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="Name" SelectedItem="{Binding SelectedScript}"/>
MainViewModel.cs
class MainViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public List<Script> Scripts
{
get; set;
}
public RelayCommand NewScriptCommand
{
get; set;
}
public MainViewModel()
{
Scripts = Script.Scripts;
NewScriptCommand = new RelayCommand(NewScript);
}
private void NewScript()
{
Script.NewScript();
OnPropertyChanged("Scripts");
}
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
我的模型,类Script.cs
public class Script
{
private static List<Script> _scripts;
public static List<Script> Scripts
{
get
{
if(_scripts == null)
{
_scripts = GetScripts();
}
return _scripts;
}
}
public static void NewScript()
{
_scripts.Add(new Script());
}
}
我在考虑在MainViewModel中创建ObservableCollection,但是当List<Script>
脚本获得新元素时,发生了更新该集合的其他问题。
答案 0 :(得分:1)
用ObservableCollection替换List,一切都会开始工作。不确定你在说什么“问题”。删除OnPropertyChanged(“脚本”)。 Scripts属性没有改变......集合已经改变。您需要引发一个集合更改事件,这是ObservableCollection所做的事情。