2015-02-11 92 views
0

首先,我向任何一個可能覺得這是一個非常愚蠢的問題或已經得到解答的問題表示歉意。我對MVVM,XAML非常陌生,並且已經閱讀了StackOverflow上的所有內容,但我仍然無法理解我確信的是一個簡單的概念。在ComboBox上獲取SelectedItem問題 - MVVM ObservableCollection

所以我有一個MVVM設置在一個Observable集合放入組合框。這是觀點。

public class AppSettings : INotifyPropertyChanged 
{ 
    public class Regions 
    { 
     public int code { get; set; } 
     public string region { get; set; } 
    } 

    private ObservableCollection<Regions> _ItemsRegions = new ObservableCollection<Regions> 
    { 
     new Regions() { code = 0, region = "Metro : All Areas" }, 
     new Regions() { code = 25, region = "Metro : North of River"}, 
     new Regions() { code = 26, region = "Metro : South of River"}, 
     new Regions() { code = 27, region = "Metro : East/Hills"}, 
    }; 
    public ObservableCollection<Regions> Region 
    { 
     get { return this._ItemsRegions; } 
    } 

    private Regions _selectedRegion; 
    public Regions SelectedRegion 
    { 
     get { return _selectedRegion; } 
     set 
     { 
      if (value != _selectedRegion) 
      { 
       _selectedRegion = value; 
       RaisePropertyChanged("SelectedRegion"); 
      } 
     } 
    } 

作爲參考,這裏是我的組合框。

<ComboBox Name="Regions" ItemsSource="{Binding Region}" DisplayMemberPath="region" SelectedItem="{Binding SelectedRegion, Mode=TwoWay}"/> 

現在的好消息是,我有工作的SelectedItem,我能夠與MVVM獲得我需要做出改變等等,這是偉大的價值!起初這個概念有點難以理解,但一旦我掌握了它,我就知道發生了什麼事情。所以我現在可以以任何方式保存數據....最終的計劃是將其放入漫遊數據中。這是一款通用應用程序。

所以問題是用戶完成這個頁面,並遠離它。當他/她回來時,ComboBox將加載所有數據(如預期的那樣),但我剛剛保存的SelectedItem不是。如在,「IsSelected = True」項目爲空,所以它只是說「選擇一個項目」。

爲了在頁面加載時需要做什麼,從保存中獲取SelectedItem並將其設置爲ComboBox。我一直很愚蠢,試圖將Region.ComboBox.SelectedItem設置爲「字符串」,但當然這會破壞並破壞整個MVVM的目的!

那麼,我需要做什麼?我很高興指出一些文件供我閱讀。

更新編輯

所以下面從這裏用戶勸我把我搞定;設置INotifyPropertyChanged邏輯,並把它放在一個空白的應用程序。只是爲了看到我沒有做任何愚蠢的事情。

不幸的是,空白的應用程序也有相同的問題,從頁面導航離開並返回到它沒有我以前選擇的值...爲了說明這一點,這裏是一個快速截圖。

要導航回來,我使用硬件後退按鈕。

Screenshot of what's happening

我猜,我只是缺了一塊拼圖,使這項工作。這整個MVVM XAML概念對我來說都是新鮮事,雖然我正在學習很多東西,但我真的堅持不懈!

任何接受者?提示?想法?例子?

更新2

好了,下面更多一些建議張貼在這個問題上的意見,我去了,對「this._selectedRegion」的對象ID添加了一個調試器的軌道。

對象ID的監視顯示,當用戶從組合框中選擇其中一個項目時,數據實際上設置正確。大!但是當用戶離開頁面並返回時,它被設置爲空。不是很好!

我的平淡無奇的臉我完全錯過了這一點?我打算在「OnNavigatedTo」又名,拳頭負責爲自己的組合框設置SelectedItem嗎?由於在數據永遠不會保存在導航離開,並回到它是設置爲null實際上預計在MVVM?我是否操作「get」語句並指定它的意思是ObservableCollection Item?粗暴的方式,但像

_selectedRegion = something return _selectedRegion

這聽起來非常粗糙,我和它不應該是什麼,但也許我只是不欣賞MVVM設置正確?

想到任何人?

+0

您確定在您的ViewModel中將SelectedRegion設置爲'_ItemsRegions'中的其中一個項目的時間_用戶回來_嗎? – DrKoch 2015-02-11 11:48:32

+0

附註:我認爲應該是'公開課區域'(單數) – DrKoch 2015-02-11 11:49:11

+0

Hi @DrKoch。要回答你的第一條評論,我很確定我能夠得到_ItemRegion的值。例如'var mes = new MessageDialog(_selectedRegion.code.ToString()); mes.ShowAysnc()'使值出現在消息框中。 對於附註。這不是公共類地區?我應該倍增並複製Regions嗎? – 2015-02-11 12:00:37

回答

0

對於WPF中的ComboBox,將SelectedItem設置爲ItemsSource中的其中一項非常重要。

確保SelectedItem當他/她回來時具有正確的值(或已設置)


編輯

你結合

SelectedItem="{Binding SelectedRegion, Mode=TwoWay}" 

將調用SelectedRegion吸氣劑控制生成時。它會在組合框中的值發生更改時調用setter。

+0

感謝您的答案,但一些澄清如何檢查這個?從我能看到的SelectedItem是從itemsource的數據綁定?正如在值匹配其中一個選項! – 2015-02-11 13:45:36

+0

在「SelectedRegion」的getter和setter中設置斷點。觀察用戶_navigates away_和__返回時發生了什麼_ – DrKoch 2015-02-11 13:57:04

+0

他們按預期發射/或者我沒有看到它的問題。導航到頁面「獲取」並使用適當的斷點從列表中選擇「設置」。 有沒有辦法檢查獲取的數據?看看它試圖將selecteditem設置爲什麼? – 2015-02-11 14:08:27

相關問題