ComboBox SelectedIndex在内容更改时丢失

时间:2012-02-21 15:47:01

标签: wpf vb.net combobox

我有一个内容可能会改变的ComboBox。问题是当内容改变时,1)我丢失了先前的selectedIndex,2)SelectedIndex被设置为-1。 我想要一个MVVM解决方案,而不是一些涉及代码隐藏的解决方案。 我可以在内容更改时将SelectedIndex设置为0,但-1不是我的模型的有效值。

我作为'技巧'所做的是将属性的setter绑定到SelectedIndex,以便在值设置为-1时将值设置为0。所以现在我的模型中没有不正确的值。但ComboBox不显示“0”项,而是显示空框。

如果我的ComboBox在内容发生变化时显示第一项(索引0),我该怎么办?

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

Weeks是一个Notifying属性,是一个字符串列表。当我更改Year属性时它会被更改。 WeekNumber是整数类型的通知属性。现在当它设置为-1时,我将相应的私有成员设置为0以避免我的模型中出现错误的值。

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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>

您可以为所有组合框定义这样的触发器。谷歌有关样式和触发器的更多信息。