Wpf ComboBox没有触发SelectedIndex

时间:2012-06-13 06:06:42

标签: c# wpf wpf-controls

我有一个场景,其中组合框可以具有相同的字符串值。对于exa组合框,可以在下拉列表中包含以下值:  “测试”,  “测试1”,  “测试1”,  “测试1”,  “Test2的”,

根据所选索引,我正在填充另一个组合框。我的Xaml看起来像:

<Grid >
    <Grid.RowDefinitions>
        <RowDefinition Height="40"></RowDefinition>
    </Grid.RowDefinitions>
    <ComboBox ItemsSource="{Binding Path=ComboList, Mode=OneWay}"
              SelectedIndex="{Binding Path=ComboIndex, Mode=TwoWay}"/ >
</Grid>

ViewModel看起来像:

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;
}

我面临的问题是,如果我在相同的字符串值之间填充(例如,将索引1中的“Test1”的值更改为索引2处的“Test1”,则会在此处填充。

2 个答案:

答案 0 :(得分:1)

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

 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
 }

在您的viewmodel中,您现在可以创建MyItem列表并根据需要填充它。

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

所以你不必关心任何索引,因为你已经建立了你的关系。

答案 1 :(得分:0)

而不是绑定到List<string>,封装字符串,例如

public class Item
{
    public Item(string v){ Value = v; }
    public string Value{get; private set;}
}

并绑定到List<Item>

然后修改您的Xaml以指定DisplayMemberPath

<ComboBox ItemsSource="{Binding Path=ComboList, Mode=OneWay}"  
          DisplayMemberPath="Value"
          SelectedIndex="{Binding Path=ComboIndex, Mode=TwoWay}"/ >  

这对我有用。