簡體   English   中英

WPF - MVVM - C# 在 ItemsSource 更改后無法設置 combobox 的 SelectedItem

[英]WPF - MVVM - C# Cannot set SelectedItem of combobox after ItemsSource changes

我已經為這個問題苦苦掙扎了好幾天了。 我有一個 combobox 兩次獲得它的 ItemsSource。 我第一次嘗試查看是否有要顯示的數據的脫機備份。 在顯示離線數據時,軟件需要從數據庫中下載更新的數據。

如果我在脫機備份中沒有任何存儲數據,一切正常。 當我備份項目列表時出現問題,我將其放入 combobox 項目源,然后在幾秒鍾后更改該列表。

該列表實際上顯示正確,但是 selectedItem (這是我從視圖模型中獲得的)被重置,我無法從代碼隱藏中再次設置它。 viewModel 中的 SelectedItem 屬性實際上已正確設置,但它並沒有到達 UI。

該列表是與 selectedItem 類型相同的 ObservableCollection。

我的 combobox

<ComboBox ItemsSource="{Binding SomeList, Mode=OneWay}"
                          SelectedItem="{Binding ListItem, Mode=TwoWay}"
                          DisplayMemberPath="ItemProperty"
                          Margin="10,0,0,0" Width="300" VerticalAlignment="Center"/>  

我在離線和在線方法中設置 selectedItem 的方式:

SomeList= await _mainRepository.BackEndOfflineFirst_GetList();

if (SomeList.Count > 0)
{ 
      ListItem = SomeList.SingleOrDefault(list=> list.Property.Equals(SomeVariable.Property));
}

任何幫助表示贊賞。 我應該提一下,將 IsSynchronizedWithCurrentItem="True" 添加到 combobox 始終使 selectedItem 成為列表的第一項。

對 list.property 的檢查等於另一個變量。property 總是返回一個保證在列表中的元素,並且永遠不會是 null。

忘了提(有點重要,我的錯),但我使用的是 Prism 並且我實現了 BindableBase,所以屬性定義如下:

private ObservableCollection<Type> _someList ;
    public ObservableCollection<Type> SomeList
    {
        get { return _someList ; }
        set { SetProperty(ref _someList , value); }
    }

從您的解釋中無法推斷出問題的原因。 代碼示例中的一切都是正確的 - 問題出在其他地方。 以防萬一,我請您澄清一下:您是否在所有屬性中提出 PropertyChanged?

一個提示(包括作為可能的原因),使用可觀察集合的 ReadOnly 屬性:

public ObservableCollection<...> SomeList {get;}
    = new ObservableCollection<...>();
SomeList.Clear();
foreach(var item in await _mainRepository.BackEndOfflineFirst_GetList())
    SomeList.Add(item);

找出為什么它不起作用。

BindableBase propertyChanged 僅在值實際更改時才被引發。

我得到了基本相同的 object(不同的對象,相同的值),所以它實際上並沒有提高 propertyChanged。

為了解決這個問題,我放了一個

ListItem = null;
SomeList.Clear();

在 finally 子句中,在實際將我從數據庫收到的值提供給 ListItem 之前。

如果我太快更改屬性(因此是 finally 子句),它似乎也不起作用,所以我不能只放一個

SomeList.Clear();
SomeList = await...

背靠背。

我發現的另一個問題是 SomeList.Clear() 實際上拋出了一個 NotSupportedException 並沒有真正出現,因此跳過了一些代碼。

這是由於 SomeList 是 ObservableCollection 造成的。 將其更改為通用列表,我現在可以清除它。 如果需要清除 ObservableCollection,簡單的 Collection = null; 也可以。

感謝所有幫助過我的人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM