wpf ComboBox Асинхронное связывание с источником проблем - PullRequest
1 голос
/ 10 июля 2009

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

привязка выполняется в двух источниках обновлений, свойство является типом наблюдаемой коллекции

Ответы [ 5 ]

2 голосов
/ 21 февраля 2012

Просто нужно работать с ObservableCollection и загружать только как AddRange (не использовать 'Add')

Когда мы загружаем данные как:

foreach (object item in items)
{
    MyList.Add(item); // Where MyList is a ObservableCollection
}

Затем после добавления первого элемента ObservableCollection вызывает OnCollectionChanged. Затем ComboBox попытается выбрать SelectedValue и вернуть 'null', когда не может найти этот элемент.

Это может решить проблему:

using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel;

namespace System.Collections.ObjectModel
{
    /// <summary> 
    /// Represents a dynamic data collection that provides notifications when items get added, removed, or when the whole list is refreshed. 
    /// </summary> 
    /// <typeparam name="T"></typeparam> 
    public class ObservableCollectionEx<T> : ObservableCollection<T>
    {
        /// <summary> 
        /// Initializes a new instance of the System.Collections.ObjectModel.ObservableCollection(Of T) class. 
        /// </summary> 
        public ObservableCollectionEx()
            : base() { }

        /// <summary> 
        /// Initializes a new instance of the System.Collections.ObjectModel.ObservableCollection(Of T) class that contains elements copied from the specified collection. 
        /// </summary> 
        /// <param name="collection">collection: The collection from which the elements are copied.</param> 
        /// <exception cref="System.ArgumentNullException">The collection parameter cannot be null.</exception> 
        public ObservableCollectionEx(IEnumerable<T> collection)
            : base(collection) { }

        /// <summary> 
        /// Adds the elements of the specified collection to the end of the ObservableCollection(Of T). 
        /// </summary> 
        public void AddRange(IEnumerable<T> collection)
        {
            //
            // Add the items directly to the inner collection
            //
            foreach (var data in collection)
            {
                this.Items.Add(data);
            }

            //
            // Now raise the changed events
            //
            this.OnPropertyChanged(new PropertyChangedEventArgs("Count"));
            this.OnPropertyChanged(new PropertyChangedEventArgs("Item[]"));

            this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
        }

    }
}
2 голосов
/ 31 октября 2009

У меня была такая же проблема раньше. И решение состоит в том, чтобы убедиться, что атрибут Itemsource comboBox в XAML не был объявлен перед атрибутом SelectedValue. Это должно работать тогда.

0 голосов
/ 03 сентября 2009

Если по какой-то причине BindingSource для ItemsSource больше не содержит SeletedItem (потому что он повторно инициализирован или что-то еще), то SelectedItem может быть сброшен к значению по умолчанию, то есть к нулю. Из вашего примера я не могу сказать, почему это должно происходить, но это может быть из-за того, что вы просто пропустили добавление дополнительного кода среды.

0 голосов
/ 03 сентября 2009

Это может быть проблемой вашей viewmodel ierarchy.Например, если оба конца вашей привязки являются свойствами зависимости, а свойство ownertype не привязано к определенному классу (например, установите родительский класс), это свойство зависимости будет использоваться всеми наследниками вместе.Плохой дизайн

0 голосов
/ 13 августа 2009

У меня есть приложение mvvm с почти таким же сценарием. Главное окно имеет вкладку управления. Есть вкладка, содержащая выпадающий список. Источник элементов комбинированного списка привязан к IList (в модели представления), а значение Selected привязано к свойству в модели представления, реализующей INotifyPropertyChanged.

<ComboBox ItemsSource="{Binding AllowedJudges}"  
                  SelectedValue="{Binding SelectedJudge, UpdateSourceTrigger=PropertyChanged}"  >

При выборе другой вкладки свойство модели представления, привязанное к SelectedValue, таинственным образом устанавливается равным нулю. Я могу справиться с этим, не позволяя свойству SelectedValue-bound установить значение null:

 public Judge SelectedJudge
  {
     get { return selectedJudge; }
     set
     {
        if(selectedJudge==value || value==null) return;
        selectedJudge = value;
        OnPropertyChanged("SelectedJudge");
        updateViewData();
     }
  }

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

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