WPF ListBox Selection Проблема при изменении элемента - PullRequest
2 голосов
/ 13 мая 2009

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

Есть ли способ это исправить?

Вот пример приложения, которое демонстрирует проблему.

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
        this.DataContext = new WindowViewModel();
        lst.SelectedIndex = 0;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        ((WindowViewModel)this.DataContext).Items[0] = "New Item";
    }
}

public class WindowViewModel
{
    public WindowViewModel()
    {
        Items = new ObservableCollection<string>();
        Items.Add("Item1");
        Items.Add("Item2");
        Items.Add("Item3");
    }

    public ObservableCollection<string> Items { get; set; }
}

<Window x:Class="WpfSelectionIssue.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <StackPanel>
        <Button Content="Change" Click="Button_Click" />
        <ListBox x:Name="lst" ItemsSource="{Binding Items}" />
    </StackPanel>
</Window>

ImageOfIssue http://img136.imageshack.us/img136/9396/wpfselectionissue.jpg

Ответы [ 3 ]

4 голосов
/ 13 мая 2009

После поиска немного больше, я нашел решение. Добавление IsSynchronizedWithCurrentItem в ListBox решило проблему.

<ListBox 
    x:Name="lst" 
    ItemsSource="{Binding Items}" 
    IsSynchronizedWithCurrentItem="True"
    />
1 голос
/ 08 апреля 2011

У меня также была эта проблема, когда я не мог отменить выбор каких-либо элементов. Кажется, что список не понимает, когда у вас есть несколько элементов в списке, которые абсолютно одинаковы. (И, таким образом, он выбирает их все, но не отменяет их выбор)

Это также происходит, когда вы изменяете значение выбранного элемента при привязке. Сначала необходимо отменить выбор индекса (например, listBox.SelectedIndex = -1;), а затем изменить значение.

Надеюсь, это поможет кому-то с той же проблемой, что и я.

0 голосов
/ 13 мая 2009

Хотя это не очень хороший ответ, и я лично не был бы доволен этим, поэтому я попробовал и нашел альтернативу.

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

Используйте CollectViewSource между ListBox и моделью просмотра.

<Window x:Class="TestApplication.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
  <Window.Resources>
    <CollectionViewSource x:Key="ViewSource" Source="{Binding Items}" />
  </Window.Resources>
  <StackPanel>
    <Button Content="Change" Click="Button_Click" />
    <ListBox x:Name="lst" ItemsSource="{Binding Source={StaticResource ViewSource}}" />
  </StackPanel>
</Window>

Не могу объяснить, что происходит в вашем примере, может быть ошибка в WPF, но это лучшее / более чистое решение. Я подозреваю, что IsSynchronizedWithCurrentItem="True" создает источник представления для вас за кулисами, и именно поэтому он работает.

НТН,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...