如何在 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
将在您对集合进行任何更改时动态更新其布局。
我在尝试填充列表框时遇到问题。 我的 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
将在您对集合进行任何更改时动态更新其布局。