Выбор WPF ListView не может быть очищен при загрузке? - PullRequest
2 голосов
/ 20 октября 2010

Я просмотрел несколько связанных ответов и определил, что могу программно очистить выбор, установив lstData.SelectedIndex = -1;Однако, когда я делаю это сразу после установки контекста данных при запуске, он почему-то никогда не работает и настраивается на выбор первого элемента в списке.

Я также попытался добавить параметр в XAML, и -1на самом деле это значение по умолчанию Visual Studio, хотя на самом деле его нет в XAML, если вы его не установите.Т.е.:

    <ListView Margin="6,6,6,203" 
        IsSynchronizedWithCurrentItem="True" 
        x:Name="lstData" 
        ItemsSource="{Binding}" 
        SelectionChanged="lstData_SelectionChanged" 
        HorizontalContentAlignment="Right"
        ItemContainerStyle="{StaticResource ItemContStyle}"  
        SelectedIndex="-1">

Но это также не имеет никакого эффекта.

Кроме того, интересно, если я добавлю lstData.SelectedIndex = 3;в моем методе LoadData он НАЧИНАЕТСЯ установить с выбранным третьим членом.

Это мой соответствующий код загрузки окна:

    public Window1()
    {
        InitializeComponent(); 

        // Set start and end dates to day after tomorrow, and 
        // the next day, by default:
        StartDate = DateTime.Now.AddDays(1);
        EndDate = StartDate.AddDays(2);
        txtStartDate.Text = StartDate.ToShortDateString();
        txtEndDate.Text = EndDate.ToShortDateString();
        LoadData();
    }

    public void LoadData()
    {
        App.RefreshMembers();

        App.CalculateNeededMeals(StartDate, EndDate);

        // Bind the ListBox to our ObserveableCollection
        LayoutRoot.DataContext = 
          App.db.PFW_Members.OrderBy("FullName",true).OrderBy("CancelDate",true);
        lstData.SelectedIndex = -1;
    }

И LoadData () вызывается при других обстоятельствах и вВ этом случае он отменяет выбор.Просто не первый раз окно загружается.Как будто есть некоторый поток инициализации, который на самом деле не закончен и идет и устанавливает выбор в 0, если он равен -1 при запуске.

О, да, у меня есть обработчик изменения выбора, но он не 'изменить выбор, например:

    private void lstData_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (lstData.SelectedItem == null)
        {
            btnReactivate.IsEnabled = false;
            btnDeactivate.IsEnabled = false;
        }
        else
        {
            if (((PFW_Member)lstData.SelectedItem).CancelDate == null)
            {
                btnReactivate.IsEnabled = false;
                btnDeactivate.IsEnabled = true;
            }
            else
            {
                btnReactivate.IsEnabled = true;
                btnDeactivate.IsEnabled = false;
            }
        }
    }

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

Спасибо за любые советы!

1 Ответ

7 голосов
/ 20 октября 2010

Просто установите IsSynchronizedWithCurrentItem = "False".Это будет самый простой способ исправить это.

Здесь происходит следующее: после того, как все инициализируется (т.е. после конструктора), сработают привязки. В это время будет установлен объект ItemsBource ListBox.На этом этапе за кулисами происходит волшебство ICollectionView.По сути, ListBox будет подключен к коллекции CollectionView по умолчанию для исходной коллекции, свойство CurrentItem которой по умолчанию всегда соответствует первому элементу.Теперь, если IsSynchronizedWithCurrentItem равен true, ListBox обновит SelectedItem, чтобы он был равен ICollectionView.CurrentItem.Это то, что вызывает проблему, о которой вы упомянули.

(Примечание: после того, как все это произойдет, событие Loaded будет запущено. Поэтому комментарий dnr3 об установке SelectedIndex = -1 в событии Loaded также должен работать).

Надеюсь, это имеет смысл.

...