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"。

WPF 的 ComboBox 未触发 SelectedIndex

当我需要这样的关系时,我会在我的视图模型中创建关系并简单地绑定到这个集合

 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}"/ >  

这对我有用。