Я не понимаю эту часть:
Я вызываю методы MoveUp и MoveDown
Наблюдаемая коллекция.
ObservableCollection не имеет таких методов, по крайней мере, насколько мне известно? Также нет понятия текущего элемента или подобного.
Приношу свои извинения, если я пропустил что-то, что могло бы сделать этот пост невежественным.
Что вы можете сделать, это вместо того, чтобы связывать ваш ListView с ObservableCollection, вы можете связать его с ICollectionView (производным от ObservableCollection). Если вы установите IsSynchronizedWithCurrentItem = True в ListView, вам не нужно будет привязывать SelectedItem, он будет автоматически привязан к CurrentItem в ICollectionView.
ICollectionView также реализует MoveCurrentToNext и MoveCurrentCurrentToPrevious, которые могут быть связаны с вашими кнопками (через ICommand).
EDIT:
Теперь, когда новая информация находится на столе, мой ответ выше уже не актуален. Но я (пока) не знаю соглашения SO, как с этим справиться, если мне нужно полностью удалить пост, отредактировать вышеприведенное или просто добавить «новый» ответ. Сейчас я отредактирую этот пост.
Я пытался воссоздать ваш проект и вашу проблему. Надеюсь, я правильно понял вашу проблему и, по крайней мере, воссоздал ее.
Как и в случае с тем, что поле со списком не удерживает своего значения при перемещении в просмотре списка, оно работает для меня.
Ниже приведен соответствующий код (некоторые из них скрыты, чтобы избежать слишком большого шума).
Вам это помогает?
public class MainWindowViewModel:INotifyPropertyChanged
{
private Condition _selectedCondition;
public ObservableCollection<Condition> Conditions { get; set; }
public Condition SelectedCondition
{
get
{
return _selectedCondition;
}
set
{
if (_selectedCondition != value)
{
_selectedCondition = value;
OnPropertyChanged("SelectedCondition");
}
}
}
...
public void MoveUpExecuted()
{
int oldIndex = this.Conditions.IndexOf(_selectedCondition);
//Check if the selected item is not the first item
if (oldIndex != 0)
{
int newIndex = oldIndex - 1;
this.Conditions.Move(oldIndex, newIndex);
}
}
И класс условий:
public class Condition : INotifyPropertyChanged
{
private MyType myType;
public ObservableCollection<MyType> MyTypes { get; set; }
public MyType MyType
{
get { return myType; }
set
{
if (myType != value)
{
myType = value;
OnPropertyChanged("MyType");
}
}
}
public Condition()
{
MyTypes = new ObservableCollection<MyType>() { new MyType() { Key = "1", Value = "One" }, new MyType() { Key = "2", Value = "Two" } };
MyType = MyTypes[1];
}
... и т. Д.
<ListView
SelectedItem="{Binding Path=SelectedCondition}"
ItemsSource="{Binding Path=Conditions}"
FontWeight="Normal"
FontSize="11"
Name="listview" Margin="0,32,0,0">
<ListView.View>
<GridView>
<GridViewColumn
Width="175"
Header="Type">
<GridViewColumn.CellTemplate>
<DataTemplate>
<ComboBox
Width="150"
SelectedValuePath="Key"
DisplayMemberPath="Value"
SelectedItem="{Binding Path=MyType}"
ItemsSource="{Binding Path=MyTypes}"
HorizontalAlignment="Center" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
<Button Content="Move up"
Command="{Binding MoveUpCommand}"
/>