listview.selectionchanged, могу ли я заставить его срабатывать каждый раз, когда я нажимаю на элемент?

StackOverflow https://stackoverflow.com/questions/1089321

Вопрос

Есть ли способ заставить событие choicechanged срабатывать каждый раз, когда щелкается выбор в списке, а не только при его изменении?

Например, предположим, что у меня есть список, содержащий только один объект.Пользователь щелкает этот объект, и этот объект содержит информацию, которая заполняет некоторые текстовые поля ниже.Пользователь начинает изменять некоторые значения в этих текстовых полях (которые не привязаны к объекту).Затем они решают, что им не нужно то, что находится в этих текстовых полях, поэтому они хотели бы сбросить все до того, что находится в объекте в представлении списка.Но когда они щелкают один объект в списке, ничего не происходит, потому что выбор не изменился.

Надеюсь, это имеет смысл.Кто-нибудь знает, как я могу обойти это?

Это было полезно?

Решение

События ListView.SelectionChanged и ListViewItem.Selected не будут срабатывать повторно, если элемент уже выбран.Если вам нужно запустить его повторно, вы можете «отменить выбор» элемента при возникновении события.

private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    foreach (var item in e.AddedItems.OfType<ListViewItem>())
    {
        Trace.WriteLine("ListViewItem Selected");
        item.IsSelected = false;
    }
}

Таким образом, вы можете повторно выбрать его до тошноты.Однако, если вам не нужен фактический выбор, вам следует использовать Элементы управления.

Если вы хотите сохранить возможность выбора элементов, вам следует рассмотреть возможность регистрации на другом событии, отличном от ListView.SelectionChanged или ListView.Selected.Для этого хорошо подходит PreviewMouseDown, так как, как и при первоначальном выборе элемента, мы хотим, чтобы он происходил как при щелчке левой, так и правой кнопкой мыши.Мы могли бы прикрепить его к одному элементу ListViewItem, но поскольку в какой-то момент список может содержать больше элементов, мы можем назначить его всем элементам, используя свойство ItemContainerStyle ListView.

<ListView SelectionChanged="ListView_SelectionChanged">
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <EventSetter Event="PreviewMouseDown"
                         Handler="ListViewItem_PreviewMouseDown" />
        </Style>
    </ListView.ItemContainerStyle>
    <ListViewItem>Item 1</ListViewItem>
    <ListViewItem>Item 2</ListViewItem>
    <ListViewItem>Item 3</ListViewItem>
    <ListViewItem>Item 4</ListViewItem>
</ListView>


private void ListViewItem_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    Trace.WriteLine("ListViewItem Clicked: " + (sender as ListViewItem).Content);
}

Другие советы

private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
       if(ListView.SelectedIndex != -1)
         {
         //to do staff
         }
       ListView.SelectedIndex = -1;
 }

также мы можем использовать этот!

 <ListView x:Name="ListView" 
                                  Height="Auto" SelectionChanged="ListView_OnSelectionChanged"
                                  Width="260"
                                  Margin="0,-12,0,-25">
                                    <ListView.ItemTemplate>
                                        <DataTemplate>
                                            <StackPanel>
                                                <TextBlock Text="{Binding name_to_show_menu,Mode=TwoWay}" Tapped="UIElement_OnTapped"></TextBlock>
                                            </StackPanel>
                                        </DataTemplate>
                                    </ListView.ItemTemplate>
                                </ListView>

и в коде позади

  private void UIElement_OnTapped(object sender, TappedRoutedEventArgs e)
   {   
           //this fire every time 
   }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top