2012-02-21 61 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