StackPanel的ObservableCollection作为WPF中ComboBox的ItemsSource

时间:2014-08-07 04:54:51

标签: wpf listview combobox observablecollection

我遇到将ObservableCollection作为ItemsSource绑定到组合框的问题(这个组合框在列表视图中有一些行)。 我跟着A collection of StackPanel as ItemsSource of ComboBox,但我没有得到任何解决问题的线索。

问题:

  1. 我能够将项目添加到表格顶部的组合框中。
  2. 我创建了一个包含3个文本块和1个组合框的列表视图。
  3. 我成功填充了listview中文本块的数据。
  4. 但问题在于Combobox。第一次,它显示ListView中每行的所有项目。一旦我选择项目或再次单击组合框以查看项目,我的列表就会消失。列表视图行中只有一个组合框显示所有项目。其他组合框显示空白。
  5. 另外,我试图保存所选项目的索引并在下次显示所选面板。但我没有得到如何将stackpanel与selecteditem和selecteditemvalue绑定。

    我尝试了很多方法将项目直接绑定到listview中的组合框。但没有任何效果。请求有人帮助我。

    代码详情如下:

    我的XAML如下:

    <Grid>
        <Grid Height="40">
            <ComboBox x:Name="cbList" />
        </Grid>
        <Grid Margin="0,56,0,168"></Grid>
        <ListView x:Name="lvFirst" Margin="0,195,0,12">
            <ListView.View>
                <GridView >
                    <GridViewColumn>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Width="50" x:Uid="tbListView1" Text="{Binding FirstName}" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Width="50" x:Uid="tbListView2" Text="{Binding LastName}" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Width="50" x:Uid="tbListView1" Text="{Binding ID}" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <ComboBox Width="100" x:Uid="cbListView" ItemsSource="{Binding Path=SPForComboBox}" />        
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>                        
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>
    

    在后面的代码中,我有一个Contact类,如下所示:

    public class Contact : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        void Notify(string propName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propName));
            }
        }
    
        private string _fn;
        private string _ln;
    
        public string FirstName
        {
            get
            { return _fn; }
            set
            { _fn = value; Notify("FirstName"); }
        }
        public string LastName
        {
            get
            { return _ln; }
            set
            { _ln = value; Notify("LastName"); }
        }
    
        private int _id;
        public int ID
        {
            get { return _id; }
            set { _id = value; Notify("ID"); }
        }
    
        public StackPanel sp;
    
        public override string ToString()
        {
            return FirstName + " " + LastName;
        }
    
        private ObservableCollection<StackPanel> _sp;
        public ObservableCollection<StackPanel> SPForComboBox
        {
            get { return _sp; }
            set { _sp = value; Notify("SPForComboBox"); }
        }
    }
    

    要填充cbList项,我在Initialization()函数后重复调用下面的函数:

    private void AddColours(string name, byte hexcolor)
        {
            //Add this ShiftType to Combo box
            SolidColorBrush rectangleBrush = new SolidColorBrush();
            Color color = new Color();
            color.A = hexcolor;
            rectangleBrush.Color = color;
    
            System.Windows.Controls.StackPanel stkPanel = new StackPanel(); //stack panel to hold rectangle + text
            stkPanel.Orientation = Orientation.Horizontal;
            cbList.Items.Add(stkPanel);
    
            Rectangle colorRect = new Rectangle(); //rectangle showing colour for shift
            colorRect.Height = 12;
            colorRect.Width = colorRect.Height;
            colorRect.Fill = rectangleBrush;
            stkPanel.Children.Add(colorRect);
    
            System.Windows.Controls.TextBlock cboText = new TextBlock(); //Name of shift
            cboText.Text = name;
            cboText.Margin = new Thickness(5, 5, 5, 5);
            stkPanel.Children.Add(cboText);
        }
    

    在主窗口类中,我创建了一个ObservableCollection对象作为公共静态(对象名称是联系人)。

    public static ObservableCollection<Contact> contacts = new ObservableCollection<Contact>();
    

    在Initialization()函数之后,我填充联系人如下:

    AddColours("First", 100);
            AddColours("Second", 50);
            AddColours("Third", 20);
            AddColours("Fourth", 0);
            AddColours("Fifth", 80);            
    
            Contact c1 = new Contact();
            c1.FirstName = "Digo";
            c1.LastName = "Maradona";
            c1.ID = 0;
            c1.SPForComboBox = new ObservableCollection<StackPanel>();
            foreach (StackPanel sp in cbList.Items)
            {
                c1.SPForComboBox.Add(sp);
            }
    
            Contact c2 = new Contact();
            c2.FirstName = "Brian";
            c2.LastName = "Lara";
            c2.ID = 1;
            c2.SPForComboBox = new ObservableCollection<StackPanel>();
            foreach (StackPanel sp in cbList.Items)
            {
                c2.SPForComboBox.Add(sp);
            }
    
            Contact c3 = new Contact();
            c3.FirstName = "Sachin";
            c3.LastName = "Tendulkar";
            c3.ID = 2;
            c3.SPForComboBox = new ObservableCollection<StackPanel>();
            foreach (StackPanel sp in cbList.Items)
            {
                c3.SPForComboBox.Add(sp);
            }
    
            contacts.Add(c1);
            contacts.Add(c2);
            contacts.Add(c3);
    
            lvFirst.ItemsSource = contacts;
    

1 个答案:

答案 0 :(得分:0)

HighCore,非常感谢您的链接。我已经有了实现并添加了组合框。

我也觉得所遵循的方法并不好。我一定会看看你提供的替代方案,并由pushpraj建议。

答案: 我认为在其他组合框中引用对象将起作用,直到该组合框中存在项目。但我需要创建矩形和文本块,以便为我创建的组合框和组合框中的每个条目创建。

所以我当然需要在foreach循环中完成它。 此外,一旦我这样做,我可以使用SelectedIndex引用整数和SelectedItem到sp(该类中的单个stackpanel)。

此方法不适合,但可能对某人有帮助。

感谢。