2009-07-10 1 views
0

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

вязка TwoWay updatesource OnPropertyChanged и свойство типа ObservableCollection

+0

Не могли бы вы опубликовать соответствующую XAML и/или C#? Это может помочь нам понять, что вы пытаетесь сделать, и сузить проблему. – Andy

ответ

1

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

+0

Я видел XAMl выше. Переместить атрибут Itemsource после атрибута selectedvalue. Я буду работать –

0

У меня есть приложение MVVM с почти точно по такому же сценарию. В главном окне есть элемент управления вкладкой. Существует вкладка, содержащая поле со списком. Источник items combobox привязан к IList (в модели представления), а значение Selected привязано к свойству в модели представления, реализующей INotifyPropertyChanged.

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

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

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

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

+0

это моя проблема 2 –

+0

Есть ли причина, по которой вы используете SelectedValue, а не SelectedItem? Не обязательно ошибка, если вы знаете, что делаете, просто раздражая меня. Наблюдение за действиями, происходящими в updateViewData, может помочь в решении вашей проблемы. –

0

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

0

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

1

Просто надо работать на ObservableCollection и загружать только AddRange (не использовать «Добавить»)

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

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)); 
     } 

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