2016-09-14 7 views
0

Как правильно очистить выбор в другом ListView? Например, у меня есть 4 представления списков, и если у меня есть выбор в listView1, то я выбираю новый элемент в listView2, я хочу, чтобы выбор в listView1 не исчез, и элемент в списке viewview2 выбран правильно. Примечание: просмотр списка - это одиночный выбор.Очистка другого списка ListView

<StackPanel> 
    <ListView x:Name="listView1" /> 
    <ListView x:Name="listView2" /> 
    <ListView x:Name="listView3" /> 
    <ListView x:Name="listView4" /> 
</StackPanel> 

я впервые попробовал:

<StackPanel> 
    <ListView x:Name="listView1" SelectionChanged="selectionchanged1" /> 
    <ListView x:Name="listView2" SelectionChanged="selectionchanged2" /> 
    <ListView x:Name="listView3" SelectionChanged="selectionchanged3" /> 
    <ListView x:Name="listView4" SelectionChanged="selectionchanged4" /> 
</StackPanel> 

код позади:

private void selectionChanged1(object sender, SelectionChangedEventArgs e) 
{ 
    listView2.SelectedItem = null; 
    listView3.SelectedItem = null; 
    listView4.SelectedItem = null; 
} 
private void selectionChanged2(object sender, SelectionChangedEventArgs e) 
{ 
    listView1.SelectedItem = null; 
    listView3.SelectedItem = null; 
    listView4.SelectedItem = null; 
} 
... 

Проблема, которую я имею, что после того, как выбор в ListView1 и щелкните элемент в listView2, выбор в listView1 очищается, но элемент в спискеView2 не выбран.

Причины в том, что есть (по крайней мере) 2 событий произвели:

  1. selectionchanged2 уволит, claring выборы в ListView 1,3,4
  2. , потому что я клиринговый выбор в ListView1, selectionchanged1 также , который очищает выбор в списке. 2,3,4
  3. Я думаю, выборchanged2 уволен снова.
  4. Поэтому у меня не было выбора в любом списке.

У вас есть лучшее предложение?

ответ

1

Я думаю, вы можете попробовать использовать этот SelectionChanged событие для всех ListViews:

private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (e.AddedItems.Count != 0) 
    { 
     if (listView1 != sender as ListView) listView1.SelectedItem = null; 
     if (listView2 != sender as ListView) listView2.SelectedItem = null; 
     if (listView3 != sender as ListView) listView3.SelectedItem = null; 
     if (listView4 != sender as ListView) listView4.SelectedItem = null; 
    } 
} 

Это просто проверить, если есть что-то новый набор в ListView, если это так, то ясно, все другое ListViews.

+1

Это прекрасно работает! Таким образом, второй SelectionChanged ничего не изменит, поскольку элемент клиринга - e.AddedItems.Count == 0. Спасибо! – kurakura88

0

Может попробовать это: Ссылка их все тот же обработчик, например:

<StackPanel> 
    <ListView x:Name="listView1" SelectionChanged="selectionchanged" /> 
    <ListView x:Name="listView2" SelectionChanged="selectionchanged" /> 
    <ListView x:Name="listView3" SelectionChanged="selectionchanged" /> 
    <ListView x:Name="listView4" SelectionChanged="selectionchanged" /> 
</StackPanel> 

, а затем:

private void selectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    string listViewName = ((ListView)sender).Name; 
    if (listViewName == "listView1") 
    { 
     listView2.SelectedItem = null; 
     listView3.SelectedItem = null; 
     listView4.SelectedItem = null; 
    } 
    else if (listViewName == "listView3") 
    { 
     listView1.SelectedItem = null; 
     listView2.SelectedItem = null; 
     listView4.SelectedItem = null; 
    } 
    else if (listViewName == "listView4") 
    { 
     listView1.SelectedItem = null; 
     listView2.SelectedItem = null; 
     listView3.SelectedItem = null; 
    } 
    else if (listViewName == "listView2") 
    { 
     listView1.SelectedItem = null; 
     listView3.SelectedItem = null; 
     listView4.SelectedItem = null; 
    } 
} 

Это грязно и долго (и непроверенные), но дайте мне знать если он работает.

+0

К сожалению, не работает, причина похоже, событие срабатывает 3 раза по сравнению с 2-х разных отправителей, клиринговых все ListView выбор. Я думаю, чтобы установить элемент управления/обработчик на StackPanel ... так, что событие запускается один раз, но ... в StackPanel нет обработчика событий SelectionChanged ... поэтому я все еще не знаю. – kurakura88

+0

Вы можете просто обработать событие 'Click'. Это, по крайней мере, гарантирует, что событие срабатывает только один раз, когда вы нажимаете другой listView. –

0

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

Для ListView1:

private void selectionChanged1(object sender, SelectionChangedEventArgs e) 
{ 
    if(listView1.SelectedItem == null) 
    { 
     listView2.SelectedItem = null; 
     listView3.SelectedItem = null; 
     listView4.SelectedItem = null; 
    } 
} 

Точно так же вы можете изменить его для других.

+0

Извините, он даже ничего не очищает. listView1.SelectedItem не имеет значения null, когда событие запущено.d – kurakura88

2

Когда вы установили значение SelectedOtem ListView в null, событие SelectionChanged будет сгенерировано снова, потому что выбранный элемент ListView был изменен, поэтому вы можете использовать флаг, чтобы пропустить второй четный вызов SelectionChanged.

Проверьте приведенный ниже фрагмент кода. Надеюсь, это поможет вам.

Часть XAML

<Window x:Class="ListView.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:ListView" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <StackPanel x:Name="MyStackPanel"> 
      <ListView x:Name="listView1" SelectionChanged="listView1_SelectionChanged" SelectionMode="Single"> 
       <ListViewItem>Item 1</ListViewItem> 
       <ListViewItem>Item 2</ListViewItem> 
      </ListView> 
      <ListView x:Name="listView2" SelectionChanged="listView1_SelectionChanged" SelectionMode="Single"> 
       <ListViewItem>Item 3</ListViewItem> 
       <ListViewItem>Item 4</ListViewItem> 
      </ListView> 
      <ListView x:Name="listView3" SelectionChanged="listView1_SelectionChanged" SelectionMode="Single"> 
       <ListViewItem>Item 5</ListViewItem> 
       <ListViewItem>Item 6</ListViewItem> 
      </ListView> 
      <ListView x:Name="listView4" SelectionChanged="listView1_SelectionChanged" SelectionMode="Single"> 
       <ListViewItem>Item 7</ListViewItem> 
       <ListViewItem>Item 8</ListViewItem> 
      </ListView> 
     </StackPanel> 
    </Grid> 
</Window> 

Кодекс-за

namespace ListView 
{ 
    using System.Windows; 
    using System.Windows.Controls; 

    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     private bool skipSelectionChanged; 

     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void listView1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      if (skipSelectionChanged) 
      { 
       skipSelectionChanged = false; 

       return; 
      } 

      var listView = sender as ListView; 

      if (listView != null) 
      { 
       var name = listView.Name; 
       for (int i = 0; i < MyStackPanel.Children.Count; i++) 
       { 
        var child = MyStackPanel.Children[i] as ListView; 
        if (child.Name != name && child.SelectedItem != null) 
        { 
         skipSelectionChanged = true; 
         child.SelectedItem = null; 
        } 
       } 
      } 
     } 
    } 
} 
+0

в какой-то момент он работает, но есть время, когда у меня есть выбор в двух списках с вашим решением. – kurakura88

+0

да, я вижу эту проблему, я постараюсь исправить код и обновить сообщение –

+0

@ kurakura88, я исправил проблему и обновил свой пост, и теперь он отлично работает, пожалуйста, проверьте мое обновление –

Смежные вопросы