简而言之,如何交换ListBox.Items的两个相邻元素?
详情如下。
我使用 WPF 列表框。
(我使用 MVVM 模式——对于这个问题来说没有那么重要,只是为了清楚起见)
我使用以下 XAML 定义定义 ListBox:
<ListBox Name="listBox1"
DisplayMemberPath="Value"
ItemsSource="{Binding StringList}"
SelectedIndex="{Binding StringListSelectedItem}" />
视图模型代码片段如下:
public ObservableCollection<StringWrapper> StringList {get; set;}
private int stringListSelectedItem;
public int StringListSelectedItem
{
get {return stringListSelectedItem;}
set {
stringListSelectedItem = value;
NotifyPropertyChanged("StringListSelectedItem");
}
}
StringWrapper
只是一个小类,以避免列表框中的相同字符串值出现问题:
public class StringWrapper
{
public string Value { get; private set; }
public StringWrapper(string v)
{
Value = v;
}
}
我想交换列表中两个元素的顺序:
StringWrapper tmp = StringList[index];
StringList[index] = StringList[index - 1];
StringList[index - 1] = tmp;
执行此类交换后,我在为 赋值时获得了不正确的行为StringListSelectedItem
:选择了 UI 中的几个项目,
但是listBox1.SelectionMode == Single
.
此外,当我在调试器中检查变量值时,一切看起来都很好,但是在窗口中,当我运行应用程序时,我看到ListBox
.
可以通过在交换后执行以下代码来修复它:
for (int i = 0; i < vm.StringList.Count(); i++)
listBox1.SelectedIndex = i;
但是每次都遍历所有项目并不是一个好主意,当我只需要设置选定的项目时。
我的代码有什么问题?它会破坏某些东西吗?如何获得正确的行为SelectedIndex
?
谢谢。