WPF 的 ComboBox 未触发 SelectedIndex
本文关键字:SelectedIndex ComboBox WPF | 更新日期: 2023-09-27 18:37:03
>我有一个组合框可以具有相同字符串值的情况。 对于 exa 组合框,下拉列表中可以有以下值: "测试", "测试1", "测试1", "测试1", "测试2",
在所选索引的基础上,我正在填充另一个组合框。我的 Xaml 看起来像:
<Grid >
<Grid.RowDefinitions>
<RowDefinition Height="40"></RowDefinition>
</Grid.RowDefinitions>
<ComboBox ItemsSource="{Binding Path=ComboList, Mode=OneWay}"
SelectedIndex="{Binding Path=ComboIndex, Mode=TwoWay}"/ >
</Grid>
视图模型如下所示:
class TestViewModel : INotifyPropertyChanged
{
private IList<string> _comboList = new List<string>
{
"Test",
"Test1",
"Test1",
"Test1",
"Test2",
};
public IList<string> ComboList
{
get { return _comboList; }
}
private int _comboIndex;
public int ComboIndex
{
get { return _comboIndex; }
set
{
if (value == _comboIndex)
{
return;
}
_comboIndex = value;
OnPropertyChanged("ComboIndex");
}
}
private void OnPropertyChanged(string prop)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
我面临的问题是,如果我在相同的字符串值之间徘徊,SelectedIndex 不会被触发(例如将值从索引 1 处的"Test1"更改为索引 2 处的"Test1"。
当我需要这样的关系时,我会在我的视图模型中创建关系并简单地绑定到这个集合
public class MyItem
{
public string Name {get; set;}//your Test, Test1, Test1 ...
public List<string> Childs {get; set;} // the childs depending on the the Name
}
在您的视图模型中,您现在可以创建我的项目列表并根据需要填充它。
public List<MyItem> MyItemList {get;set;}
在 XAML 中,您现在只需创建相关的组合框。
<ComboBox ItemsSource="{Binding Path=MyItemList}"
SelectedItem="{Binding Path=ComboIndex, Mode=TwoWay}"/ >
<ComboBox ItemsSource="{Binding Path=ComboIndex.Childs}"
SelectedItem="{Binding Path=MySelectedPropForChild, Mode=TwoWay}"/ >
因此,您不必关心任何指数,因为您已经建立了关系。
而不是绑定到List<string>
,封装字符串,例如
public class Item
{
public Item(string v){ Value = v; }
public string Value{get; private set;}
}
并绑定到List<Item>
.
然后修改 Xaml 以指定显示成员路径
<ComboBox ItemsSource="{Binding Path=ComboList, Mode=OneWay}"
DisplayMemberPath="Value"
SelectedIndex="{Binding Path=ComboIndex, Mode=TwoWay}"/ >
这对我有用。