2012-02-21 63 views
1

我有一個組合框,其內容可能會更改。問題在於內容改變時,1)我失去了之前的selectedIndex,並且2)SelectedIndex被設置爲-1。 我想要一個MVVM解決方案,而不是一些涉及代碼隱藏的解決方案。 我可以在內容更改時將SelectedIndex設置爲0,但-1對於我的模型不是有效的值。組合框SelectedIndex在內容更改上丟失

我作爲一個'技巧'所做的事情是將屬性的setter綁定到SelectedIndex,以將值設置爲-1時將值設置爲-1。所以現在我沒有在我的模型中有不正確的值。但ComboBox不顯示「0」項,而是一個空框。

當我的組合框的內容發生變化時,我的組合框會顯示第一個項目(索引0)嗎?

<ComboBox Name="WeeksComboBox"  IsEditable="False" 
             ItemsSource="{Binding Weeks}" 
             SelectedIndex="{Binding WeekNumber}" 
             > 

周是一個通知屬性是一個字符串列表。當我更改Year屬性時,它會發生變化。 WeekNumber是整數類型的通知屬性。現在,當它設置爲-1時,我將相應的私有成員設置爲0,以避免在我的模型中出現錯誤的值。

+0

我懷疑您正在重新綁定,因爲它會將選定索引設置爲-1。請將代碼粘貼到您綁定的位置以及更改內容的位置。 – Paparazzi 2012-02-21 15:54:56

+1

當你說「它改變了,我改變了一年」,你是否清除這個列表 - 如果是這樣,當它被設置爲-1,因爲沒有值(直到你添加新的值)。如果你正在做一個清晰的,然後添加你將需要設置WeekNumber = 0後添加(我會設置公共而不是私人)。我會在列表中使用ObservavleCollection。 – Paparazzi 2012-02-21 16:14:10

+0

使用ObservableCollection將自動通知其項目更改(添加,移動,刪除)。此外,如果您替換當前選定的項目,則舊的參考將丟失,因此索引將爲-1。您可以使用小型ViewModel來表示WeekNumber,如果項目值發生更改,則更改爲內部編號並通知它。 – JoanComasFdz 2012-03-28 10:55:44

回答

2

我總是這樣,在代碼隱藏時我改變源

例如,

Weeks = GetNewWeeksCollection(); 
WeekNumber = 0; 

一種替代方法是使用PropertyChange通知

void MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == "Weeks") 
     WeekNumber = 0; 
} 

當然,只有在你真的將Weeks設置爲新集合時纔有效。如果您只是清除它並重置它,則必須使用CollectionChanged事件

void Weeks_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    if (e.Action == NotifyCollectionChangedAction.Reset) 
     WeekNumber = 0; 
} 
+0

我正在改變_WeekNumber(私人整數支持WeekNumber),它沒有工作,它改變WeekNumber !!! ???仍然有一個問題:WeekNumber從例如5變爲!! - 1!然後爲0.並且-1不是有效索引... – GameAlchemist 2012-02-21 17:07:44

+0

@VincentPiel該屬性的私有版本可能不會引發'PropertyChange'通知,因此UI不知道該值已更改並且應該更新。而-1的索引意味着沒有選擇項目,所以它仍然是一個有效的值。更改源可能會重置'SelectedIndex',所以'ComboBox'負責將值設置爲'-1',但是由於您在注意到它之後立即將其設置爲'0'。 – Rachel 2012-02-21 17:33:43

0

你必須使用觸發器:

<ComboBox Name="WeeksComboBox" IsEditable="False" 
            ItemsSource="{Binding Weeks}" 
            SelectedIndex="{Binding WeekNumber}" > 
     <ComboBox.Style> 
      <Style TargetType="{x:Type ComboBox}"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Path=SelectedItemId}" Value="-1"> 
         <Setter Property="SelectedIndex" Value="0"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ComboBox.Style> 
    </ComboBox> 

你可以這樣定義觸發所有組合框。 Google瞭解更多關於樣式和觸發器的信息。

+0

當週爲空且Value =「0」無效時會發生什麼? – Paparazzi 2012-02-21 16:46:07

+0

如果你這樣做,你會失去約束力 – Rachel 2012-02-21 16:47:06

+0

thx,我更喜歡模型中的變化。 – GameAlchemist 2012-02-21 18:58:35