ListBox绑定,绑定集合中的新项目

时间:2017-12-11 01:50:22

标签: c# wpf mvvm listbox

我试图在我的应用中实现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>脚本获得新元素时,发生了更新该集合的其他问题。

1 个答案:

答案 0 :(得分:1)

用ObservableCollection替换List,一切都会开始工作。不确定你在说什么“问题”。删除OnPropertyChanged(“脚本”)。 Scripts属性没有改变......集合已经改变。您需要引发一个集合更改事件,这是ObservableCollection所做的事情。