Неверное значение SelectedIndex в ListView - PullRequest
0 голосов
/ 13 января 2019

У меня проблема со значением, возвращаемым ListView's SelectedIndex. Функция выглядит так:

private void ChangeCableStatus_DoubleClick(object sender, RoutedEventArgs e)
{
    int index = tableOfCables.SelectedIndex;
    if (index == -1) // selected empty entry
    {
        return;
    }

    var selectedEntry = tableOfCables.SelectedItems[0] as Cable;
    var node1 = selectedEntry.Node1;
    var port1 = selectedEntry.Port1;
    var node2 = selectedEntry.Node2;
    var port2 = selectedEntry.Port2;

    cableCloud.Config.Cables.FirstOrDefault(cable =>
        cable.Node1.Equals(node1) && cable.Node2.Equals(node2) && cable.Port1.Equals(port1) &&
        cable.Port2.Equals(port2)).Working ^= true;

    tableOfCables.Items.Refresh();
}

Итак, когда я дважды щелкаю по любой записи в таблице, она должна изменить статус с «true» на «false» или наоборот.

enter image description here После двойного щелчка в первый раз он работает нормально, и статус в выбранном индексе меняется на «ложь». Но затем, независимо от того, на какую запись я нажимаю, она изменяет статус ранее выбранной записи с «false» на «true». Например: я дважды щелкаю по первой строке, она меняет статус с «true» на «false», затем я выбираю 5-ю строку, дважды кликаю, она меняет статус ранее выбранной записи с «false» на «true», полностью игнорируя выбранную строку. И затем я дважды щелкаю, скажем, во 2-й строке, он меняет свой статус с «истинного» на «ложный», и история повторяется. Я проверил с помощью отладчика, и каждый второй двойной щелчок значение SelectedIndex не меняется. Как это исправить?

<ListView x:Name="tableOfCables" Margin="10,10,10,10" PreviewKeyDown="ChangeFontSizeKeyboard" PreviewMouseWheel="ChangeFontSizeMouse" IsSynchronizedWithCurrentItem="True" Grid.Row="1" ScrollViewer.HorizontalScrollBarVisibility="Disabled" AlternationCount="2">
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <Style.Triggers>
                        <Trigger Property="ItemsControl.AlternationIndex"  Value="0">
                            <Setter Property="Background" Value="White" />
                        </Trigger>
                        <Trigger Property="ItemsControl.AlternationIndex"  Value="1">
                            <Setter Property="Background" Value="#f8f8f8" />
                        </Trigger>
                    </Style.Triggers>
                    <Setter Property="HorizontalContentAlignment" Value="Center"/>
                    <EventSetter Event="MouseDoubleClick" Handler="ChangeCableStatus_DoubleClick" />
                </Style>
            </ListView.ItemContainerStyle>
            <ListView.View>
                <GridView>
                    <GridView.ColumnHeaderContainerStyle>
                        <Style TargetType="{x:Type GridViewColumnHeader}">
                            <Setter Property="FontSize" Value="15"/>
                            <Setter Property="HorizontalContentAlignment" Value="Center" />
                            <Setter Property="FontWeight" Value="Bold"/>
                        </Style>
                    </GridView.ColumnHeaderContainerStyle>
                    <GridViewColumn  Header="Node1" Width="85" DisplayMemberBinding="{Binding Node1}"/>
                    <GridViewColumn Header="Port1" Width="85" DisplayMemberBinding="{Binding Port1}"/>
                    <GridViewColumn Header="Node2" Width="85" DisplayMemberBinding="{Binding Node2}"/>
                    <GridViewColumn Header="Port2" Width="85" DisplayMemberBinding="{Binding Port2}"/>
                    <GridViewColumn Header="Working" Width="100" DisplayMemberBinding="{Binding Working}"/>
                    <GridViewColumn Header="Max BW" Width="70" DisplayMemberBinding="{Binding MaxBandwidth}"/>
                    <GridViewColumn Header="Free BW" Width="70" DisplayMemberBinding="{Binding FreeBandwidth}"/>
                </GridView>
            </ListView.View>
        </ListView>

Если кому-то интересно, весь проект находится здесь (аргумент запуска ./Resources/cloud.cloudconfig): https://drive.google.com/file/d/11e84tqgTqXJ1hsYCQOTmA4prV0r9kQNW/view?usp=sharing

1 Ответ

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

Я проверил ваш источник, это происходит потому, что вы вручную изменили хеш-код в своем классе Cable, удалите эту проблему блока, которая будет решена:

    public override int GetHashCode()
    {
        unchecked
        {
            int hashCode = (Node1 != null ? Node1.GetHashCode() : 0);
            hashCode = (hashCode * 397) ^ Port1.GetHashCode();
            hashCode = (hashCode * 397) ^ (Node2 != null ? Node2.GetHashCode() : 0);
            hashCode = (hashCode * 397) ^ Port2.GetHashCode();
            hashCode = (hashCode * 397) ^ Working.GetHashCode();
            hashCode = (hashCode * 397) ^ MaxBandwidth;
            return hashCode;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...