Как заставить мой ListBox не вызывать событие SelectionChanged, когда я назначаю ItemSource моего списка - PullRequest
1 голос
/ 09 сентября 2010

У меня есть поле со списком, которое я заполняю из веб-службы:

public Configure()
    {
        InitializeComponent();
        WebServiceSoapClient ws = new WebServiceSoapClient();
        ws.GetTypesCompleted += new  EventHandler<GetTypesCompletedEventArgs>(OnGetTypeCompleted);
        ws.GetTypesAsync();
    }

    void OnGetTypeCompleted(object sender, GetTypesCompletedEventArgs e)
    {
        if (e.Result != null)
        {
            List<CodeTableItem> source = e.Result.ToList<CodeTableItem>();
            lstType.ItemsSource = source;
            lstType.SelectedIndex = -1;

        }
    }

Поэтому, когда я устанавливаю свойство ItemSource, событие SelectionChanged запускается с SelectedIndex = 0, но пользователь еще не сделал этот выбор, и мне нужно, чтобы в этом списке не было выбранного значения, поэтому я устанавливаю SelectedIndex в -1 как вы видете. В результате, SelectionChanged вызывается дважды.

Можно ли сделать так, чтобы он вызывался только тогда, когда пользователь выбирает элемент? Спасибо!

Я использую Silverlight 3 и VS 2008

Ответы [ 2 ]

1 голос
/ 16 января 2011

В нашем приложении мы реализовали некоторый код, который установил бы логический флаг на основе события Control.LeftMouseButtonUp (). Если это установлено, это будет означать, что пользователь взаимодействовал с полем, и поэтому мы можем обрабатывать SelectionChanged с другим поведением.

В течение жизненного цикла разработки нашего приложения этот подход был необходим, чтобы привязки по умолчанию вызывали нашу логику SelectionChanged, когда мы этого не хотели.

Если вы являетесь пуристом MVVM, вам нужно представить виртуальную машину как переменную-член, а затем установить флаг bool в виртуальной машине.

НТН, Mark

1 голос
/ 14 января 2011

Вместо этого измените код так, чтобы обработчик событий SelectionChange не определялся до тех пор, пока не будут заданы источник и выбранный индекс.

void OnGetTypeCompleted(object sender, GetTypesCompletedEventArgs e)
{
    if (e.Result != null)
    {
        List<CodeTableItem> source = e.Result.ToList<CodeTableItem>();
        lstType.ItemsSource = source;
        lstType.SelectedIndex = -1;

        lstType.SelectionChanged += new SelectionChangedEventHandler(lstType_SelectionChanged);

    }
}
...