2009-05-13 3 views
2

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

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

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

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

ответ

4

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

<ListBox 
    x:Name="lst" 
    ItemsSource="{Binding Items}" 
    IsSynchronizedWithCurrentItem="True" 
    /> 
0

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

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

Используйте 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" создает источник просмотра для вас за кадром, и именно поэтому он работает.

НТН,

+0

Проблема с SelectedItems, а не с ItemsSource. –

+0

Итак, почему вам не нравится использовать IsSynchronizedWithCurrentItem? –

1

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

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

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

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