WPF, предотвратить изменение выбранного элемента в состоянии - PullRequest
0 голосов
/ 14 января 2019

У меня есть вид списка:

<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;
}

1 Ответ

0 голосов
/ 14 января 2019

Вот что вам нужно сделать в настройщике свойств.

private MyObject _previousSelectedItem;
private MyObject _currentSelectedItem;
public MyObject CurrentSelectedItem
{
    get => _currentSelectedItem;
    set
    {
        if (Condition) 
        {
            _previousSelectedItem = _currentSelectedItem;
            _currentSelectedItem = value;
        }
        else
        {
            _currentSelectedItem = _previousSelectedItem;
        }

        NotifyOfPropertyChange(()=> CurrentSelectedItem);
    }
}

Вам необходимо отслеживать предыдущее значение, которое вы можете получить при изменении currentSelectedItem. В следующий раз, если условие не истинно, просто присвойте свой currentSelecteditem предыдущее значение.

Надеюсь, это сработает для вас.

Редактировать : Я не упомянул, что вам нужно NotifyOfPropertyChange (() => CurrentSelectedItem); потому что я думал, что это слишком очевидно. Ваш код должен работать так же. Множество изменяющихся значений в Dispatcher, так как значение уже 2-х способов связать с контролем. Это сила связывания WPF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...