2009-07-10 98 views
0

我有一個mvvm應用程序,主窗口是一個選項卡控件。 我使用itemssource綁定項目組合框, 一切工作正常,直到我去另一個選項卡,由於某種原因組合框中選定的項目獲得空值,任何想法?wpf組合框異步綁定到項目源問題

的結合是onpropertychanged雙向updatesource和財產的的ObservableCollection

+0

你能發佈有關XAML和/或C#?這可以幫助我們弄清楚你想要做什麼並縮小問題的範圍。 – Andy 2009-07-11 04:30:18

回答

1

我以前有同樣的問題。解決方案是確保XAML中的組合框的Itemsource屬性尚未在SelectedValue屬性之前進行聲明。它應該工作。

0

型我有幾乎一模一樣的場景的MVVM應用程序。主窗口有一個選項卡控件。有一個包含組合框的選項卡。組合框項目源綁定到IList(在視圖模型中),並且選定值綁定到實現INotifyPropertyChanged的視圖模型中的屬性。

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

當選擇另一個選項卡時,綁定到SelectedValue的視圖模型的屬性被神祕地設置爲null。我能夠通過不允許的SelectedValue綁定屬性來處理它被設置爲null:

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

然而,這是我不明白爲什麼一個選項卡窗格成爲無形意味着在組合框中有變爲取消的值...

+0

這是我的問題兩個 – 2009-08-15 14:04:08

+0

是否有任何理由爲什麼你使用SelectedValue而不是SelectedItem? 只要你知道你在做什麼,不一定是一個錯誤,只是激怒我。 查看updateViewData中發生的操作可能有助於解決您的問題。 – 2009-09-03 11:53:27

0

如果由於某種原因,ItemsSource的BindingSource不再包含SeletedItem(因爲它已重新初始化或其他),那麼SelectedItem可以重置爲默認值,即null。 從你的例子我不知道爲什麼會發生這種情況,但也許是因爲你錯過了添加更多的環境代碼。

0

這可能是你的viewmodel ierarchy的問題。 例如,如果Binding的兩端都是依賴項屬性,並且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)); 
     } 

    } 
}