С# UWP ToggleSwitch в ListView

Предположим, у вас есть ListView ниже:

<ListView x:Name="ListViewActiveAssets" Margin="10,10,10,10" CanReorderItems="True" AllowDrop="True" CanDragItems="True" SelectionMode="Extended" DragItemsStarting="ListViewActiveAssets_DragItemsStarting" DragItemsCompleted="ListViewActiveAssets_DragItemsCompleted">
<ListView.ItemTemplate>
    <DataTemplate x:DataType="local:Asset">
        <Grid VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="36" />
                <ColumnDefinition Width="36" />
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition Width="108" />
            </Grid.ColumnDefinitions>

            <TextBlock Text="&#xE700;" FontFamily="Segoe MDL2 Assets" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Center"/>
            <TextBlock Text="{x:Bind AssetType}" FontFamily="Segoe MDL2 Assets" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Center"/>
            <TextBlock Text="{x:Bind Name}" Grid.Column="2" FontSize="18" VerticalAlignment="Center" Padding="0,0,5,0"/>
            <TextBlock Text="{x:Bind StartDate}" Grid.Column="3" FontSize="16" VerticalAlignment="Center" Padding="0,0,5,0"/>
            <TextBlock Text="{x:Bind EndDate}" Grid.Column="4" FontSize="16" VerticalAlignment="Center" Padding="0,0,5,0"/>
            <ToggleSwitch Grid.Column="8" x:Name="ToggleSwitchEnable" IsOn="{x:Bind IsEnabledSwitch}" OnContent="On" OffContent="Off" Padding="5,0" Toggled="ToggleSwitchEnable_Toggled"/>

        </Grid>
    </DataTemplate>
</ListView.ItemTemplate>

This ListBox can be reordered and this work fine. I simply would like to know why the Toggled event is fired when I reorder an item in ListView ?

Действительно, мое событие Toggled содержит код, который обновляет ListView, поэтому, когда я перетаскиваю элемент, ListView обновляется, а перетаскивание терпит неудачу.

Если у кого-то есть предложение... Заранее спасибо!


person jfilhoul    schedule 22.03.2017    source источник
comment
У вас есть Binding на ToggleSwitch. Ваш IsEnabledSwitch как PropertyChanged на нем? также Является ли ваша коллекция ObservableCollection?   -  person AVK    schedule 22.03.2017
comment
Нет, у IsEnabledSwitch нет PropertyChanged, и да, это ObservableCollection   -  person jfilhoul    schedule 23.03.2017


Ответы (1)


Попробуйте добавить локальное логическое значение в свой класс и установите для него значение false в своем конструкторе:

private bool toggling;

public myPage()
{
    toggling = false;
}

Затем в вашем методе OnToggled начните с установки для переключения значения true, а затем установите для него значение false в конце метода.

void ToggleSwitchEnable_Toggled(object sender, EventArgs e) 
{
    toggling = true;
    // Your code
    toggling = false;
}

Затем вы можете настроить свой метод обновления так, чтобы он выполнялся только в том случае, если переключение имеет значение false:

void refresh()
{
    if(toggling)
        return;
    //Your code
}

Это приведет к тому, что команда обновления будет пропущена всякий раз, когда вы переключаете переключатель.

person cvanbeek    schedule 22.03.2017
comment
Только что заметил, что я думаю, вы хотите, чтобы это не обновлялось, когда вы перетаскиваете, а не переключаете. Для этого сделайте то же самое, но вместо метода Toggled сделайте это в методе DragItemsStarting. - person cvanbeek; 22.03.2017
comment
Спасибо, это отличная идея обойти эту проблему, но есть не только тумблер, который может обновить список. Поэтому я должен включать/отключать эту переменную для каждого события. На данный момент я решаю эту проблему, потому что, когда событие запускается при перетаскивании, значение переключателя не изменяется (это еще более странно), поэтому я могу проверить это, чтобы не обновлять мой ListView. - person jfilhoul; 23.03.2017