У меня есть вид списка:
<ListView Name="ListViewItems" Grid.Row="2" Foreground="White" ItemsSource="{Binding Items}"
SelectedItem="{Binding CurrentSelectedItem ,Mode=TwoWay}"
ScrollViewer.HorizontalScrollBarVisibility="Disabled" SelectionMode="Single"
HorizontalContentAlignment="Stretch"
ScrollViewer.VerticalScrollBarVisibility="Auto"
VerticalAlignment="Stretch" BorderThickness="0" >
<ListView.ItemTemplate>
<DataTemplate >
<Grid >
<Grid.RowDefinitions>
<RowDefinition Height="25"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.5*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Width="0" Visibility="Collapsed" Content="{Binding Id}"/>
<Label Grid.Column="0" Content="{Binding Name}" HorizontalContentAlignment="Left" Foreground="White" FontWeight="Bold" Background="Transparent"/>
<Label Grid.Column="1" Content="{Binding Provider}" HorizontalContentAlignment="Left" Foreground="White" Background="Transparent"/>
<Label Grid.Column="0" Grid.ColumnSpan="2" Background="Transparent"/>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Как кажется, когда я меняю выбранный элемент (нажав на другой элемент списка), будет вызываться set
из CurrentSelectedItem
.
private MyObject _currentSelectedItem;
public MyObject CurrentSelectedItem
{
get => _currentSelectedItem;
set
{
if (Condition)
{
// here i want to have previous item seleced
// Currently i do nothing here
}
else
{
_currentSelectedItem = value;
}
}
}
Когда Condition
имеет значение true, если я ничего не делаю, CurrentSelectedItem
будет иметь предыдущее значение, которое я хочу, НО в пользовательском интерфейсе выбранного элемента (выделенный элемент) это тот, который я выбрал недавно.
Что я хочу, так это предотвратить такое поведение в пользовательском интерфейсе. Я имею в виду CurrentSelectedItem
не изменился, но пользовательский интерфейс изменился.
Есть какое-нибудь решение, чтобы предотвратить такое поведение? заранее спасибо.
Решение:
Как @ Zeb-ur-Rehman мы должны сохранить предыдущее состояние в _previousSelectedItem
. но в операторе else
я не присваиваю value
_currentSelectedItem
, как результат, когда я _currentSelectedItem = _previousSelectedItem
и текущий, и предыдущий упоминаем один и тот же объект. и поэтому OnPropertyChanged
не будет обновлять связанное представление.
Кстати, единственный способ как-то справиться с этим сценарием - это сохранить _currentSelectedMap
в предыдущем и обновить пользовательский интерфейс на _currentSelectedMap = null
.После небольшой задержки (это должна быть задержка) обновить пользовательский интерфейс по сохраненному значению. как это:
if (Condition)
{
_previousSelectedItem = _currentSelectedItem;
_currentSelectedItem = null;
NotifyOfPropertyChange(()=> CurrentSelectedItem);
Task.Delay(100).ContinueWith(x =>
{
Application.Current.Dispatcher.Invoke(() =>
{
_currentSelectedItem = _previousSelectedItem;
NotifyOfPropertyChange(()=> CurrentSelectedItem);
});
});
}
else
{
_currentSelectedItem = value;
}