Как отключить SelectionChanged при изменении ItemsSource - PullRequest
4 голосов
/ 06 июля 2011

У меня есть ComboBox с привязкой данных ItemsSource. Этот ComboBox также прослушивает событие SelectionChanged.

Однако при изменении ItemsSource возникает событие SelectionChanged. Это происходит только тогда, когда ItemsSource является представлением.

Есть ли способ вызвать SelectionChanged только тогда, когда это делает пользователь, а не при изменении свойства ItemsSource?

Ответы [ 2 ]

3 голосов
/ 07 июля 2011

Если вы выполняете привязку данных в коде, вы можете отменить подписку на SelectionChanged во время изменения ItemsSource.Ниже приведен пример кода:

XAML:

<Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <StackPanel DataContextChanged="OnDataContextChanged">
        <Button Content="Change items" Click="OnClick" />   
        <ComboBox Name="_cb" />
    </StackPanel>

</Window>

Код позади:

public partial class Window1 
{
    public Window1()
    {
        InitializeComponent();

        _cb.SelectionChanged += OnSelectionChanged;

        DataContext = new VM();
    }

    private void OnClick(object sender, RoutedEventArgs e)
    {
       (DataContext as VM).UpdateItems();
    }

    private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
    {
    }

    private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        VM vm = DataContext as VM;
        if (vm != null)
        {
            _cb.ItemsSource = vm.Items;
            vm.PropertyChanged += OnVMPropertyChanged;
        }
        else
        {
            _cb.ItemsSource = null;
        }
    }

    void OnVMPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "Items")
        {
            _cb.SelectionChanged -= OnSelectionChanged;
            _cb.ItemsSource = (DataContext as VM).Items;
            _cb.SelectionChanged += OnSelectionChanged;
        }
    }
}

public class VM : INotifyPropertyChanged
{
    public VM()
    {
        UpdateItems();
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private List<string> _items = new List<string>();
    public List<string> Items
    {
        get { return _items; }
        set
        {
            _items = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("Items"));
            }
        }
    }

    public void UpdateItems()
    {
        List<string> items = new List<string>();
        for (int i = 0; i < 10; i++)
        {
            items.Add(_random.Next().ToString());
        }
        Items = items;
    }

    private static Random _random = new Random();
}
1 голос
/ 29 мая 2017

Я нашел этот метод:

private void comboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)    
{ 
   if(!ComboBox.IsDropDownOpen)
    {
    return;
    }

    ///your code

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