如何在 WPF 中使用 DelegateCommand 从列表中填充列表框?

How to fill ListBox from a List with DelegateCommand in WPF?

我在尝试填充列表框时遇到问题。 我的 xaml 文件中有一个按钮:

<Button Content="Show" Command="{Binding ShowSongsBy}" ... >

我还有一个列表框:

<ListBox x:Name="sorted" ItemsSource="{Binding SortedListVM}" ... >

在我的 ViewModel 中我有:

        private List<string> _sortedList;
        public List<string> SortedListVM
        {
            set
            {
                _sortedList = value;
                onPropertyChanged();
            }
            get { return _sortedList; }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public void onPropertyChanged([CallerMemberName]string prop = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
        }

当我按下按钮时,会发生以下情况(也在 ViewModel 中):

public ICommand ShowSongsBy
        {
            get
            {
                return new DelegateCommand((obj) =>
                {
                    SortedListVM = new List<string>();

                    List<string> testlist = new List<string>();
                    testlist.Add("1");
                    testlist.Add("2");

                    foreach (string i in testlist)
                    {
                        SortedListVM.Add(i);
                    }
                });
            }
        }

我希望在列表框中看到的内容:“1”和“2”。我看到的是:只是“1”

我不知道是什么问题。 另外,如果我将代码更改为:

public ICommand ShowSongsBy
{
...
                    foreach (string i in testlist)
                    {
                        SortedListVM.Add(i);
                    }

                    SortedListVM.Add("Test1");
...

我看到了我希望在列表框中看到的内容:“1”、“2”和 "Test1"。

如果我只想列出“1”和“2”怎么办?

我的 DelegateCommand class:

class DelegateCommand : ICommand
    {
        private Action<object> execute;
        private Func<object, bool> canExecute;

        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }

        public DelegateCommand(Action<object> execute, Func<object, bool> canExecute = null)
        {
            this.execute = execute;
            this.canExecute = canExecute;
        }

        public bool CanExecute(object parameter)
        {
            return this.canExecute == null || this.canExecute(parameter);
        }

        public void Execute(object parameter)
        {
            this.execute(parameter);
        }
    }    

谢谢。

使用 ObservableCollection 而不是 List

private ObservableCollection<string> _sortedList;
public ObservableCollection<string> SortedListVM
{
    get => _sortedList;
    set
    {
        _sortedList = value;
        onPropertyChanged();
    }
}

... 并用它做您想做的事。与您使用 List.

操作的方式相同

ListBox 将在您对集合进行任何更改时动态更新其布局。