我有一个内容可能会改变的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以避免我的模型中出现错误的值。
答案 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>
您可以为所有组合框定义这样的触发器。谷歌有关样式和触发器的更多信息。