我有一种情况,我需要将我的组合框的SelectedIndex设置为0,以防selectedItem从ItemsSource集合中删除。一个小样本很好地复制了这种情况 -
的Xaml
<Grid>
<ComboBox x:Name="cmb" ItemsSource="{Binding Names}" VerticalAlignment="Top">
<ComboBox.Style>
<Style TargetType="ComboBox">
<Style.Triggers>
<Trigger Property="SelectedValue" Value="{x:Null}">
<Setter Property="SelectedIndex" Value="0"/>
</Trigger>
</Style.Triggers>
</Style>
</ComboBox.Style>
</ComboBox>
<Button VerticalAlignment="Bottom" Width="100" Height="20" Click="Button_Click"/>
</Grid>
我没有将SelectedItem或SelectedIndex绑定到任何值。在加载时,触发器工作正常并将SelectedIndex设置为0但是在按钮单击时,我将从Names集合中删除当前的selectedItem。因此,所选值设置为null。但在这种情况下触发器不会触发,而组合框也是空白。
我知道可以通过监听SelectionChanged
事件并在当前currentItem为null的情况下将SelectedIndex设置为0来解决代码问题。但是,由于一些限制,我不能使用这种方法。我想要一些纯粹的xaml方法。提前谢谢..
修改
将IsSynchronizedWithCurrentItem
设置为True
for combobox,可以防止组合框为空,但是在从ItemSource集合中删除selectedItem时,它会设置下一个可用的值,但我希望我的第一个项目被选中
答案 0 :(得分:2)
我认为这是因为你不能在触发器中拥有与触发器所基于的值相同的值,并且基本上SelectedValue
,'SelectedItem'和SelectedIndex
只是不同的引用方式到同一个项目。
您会注意到,如果您为触发器添加背景颜色,它会被应用,因此触发器肯定会正常工作。
我不确定你所说的阻止你使用SelectionChanged
的限制,但我经常看到人们说这样的东西,因为他们是MVVM设计模式的新手,并认为这意味着应用程序应该没有代码隐藏。那是不对的。
使用MVVM意味着代码隐藏中不应该有业务逻辑。 UI逻辑在View后面的代码中完全可以接受,我认为这是UI逻辑,因为它唯一要做的就是根据UI值改变UI。
答案 1 :(得分:0)
由于您无论如何都要删除button_Click中的所选项目,因此在删除当前所选项目后,您可以通过在Button_Click(sender,eventargs)处理程序中将selectedIndex值设置为零来完成您想要的操作!