在ListBox中绑定ComboBox

时间:2011-09-15 06:44:50

标签: wpf xaml data-binding combobox listbox

我无法想象这一个。如果我只是将组合框本身没有嵌入到列表框中,它将填充并选择我需要的值。

XAML

<ComboBox Name="comboBox1" 
          Height="23" 
          DataContext="{Binding Combox}" 
          ItemsSource="{Binding Comboxes}" 
          DisplayMemberPath="PV" 
          SelectedValuePath="PK"                  
          SelectedItem="{Binding SelectedItem}"
          VerticalAlignment="Top" 
          Width="120" />       

背后的守则

    public MainWindow()
    {
        InitializeComponent();

        DataAttribute d = new DataAttribute(2, "blue");

        Combox c = new Combox();

        c.SelectedItem = d;
        c.Comboxes.Add(new DataAttribute(1, "red"));

        c.Comboxes.Add(new DataAttribute(3, "Black"));
        c.Comboxes.Add(c.SelectedItem);

        comboBox1.DataContext = c;
    }

保存数据的类

public class Combox: INotifyPropertyChanged
{
    public Combox()
    {
        Comboxes = new List<DataAttribute>();            
    }

    private DataAttribute _selectedItem;// = new DataAttribute(-1, "NA");

    public List<DataAttribute> Comboxes { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;

    public DataAttribute SelectedItem
    {
        get { return _selectedItem; }
        set
        {
            if (_selectedItem == value) return;
            _selectedItem = value;
            OnPropertyChanged("SelectedValue");
        }
    }

    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }        
}

public class DataAttribute
{
    public DataAttribute() { }

    public DataAttribute(int pk, string pv)
    {
        PK = pk;
        PV = pv;
    }

    public int PK { get; set; }
    public string PV { get; set; }

    public override string ToString()
    {
        return PV;
    }
}

一切正常,但只要我尝试在列表框中创建一个com框列表就没有了。我可以看到组合但没有数据。你怎么绑定它是XAML?

    public MainWindow()
    {
        InitializeComponent();

        List<Combox> com = new List<Combox>();
        DataAttribute d = new DataAttribute(2, "blue");

        Combox c = new Combox();

        c.SelectedItem = d;
        c.Comboxes.Add(new DataAttribute(1, "red"));

        c.Comboxes.Add(new DataAttribute(3, "Black"));
        c.Comboxes.Add(c.SelectedItem);

        com.Add(c);

        lstTest.ItemSource = com;
    }

这里是带有列表框的XAML。它不再束缚......

    <ListBox Name="lstTest" ItemsSource="{Binding}">        
        <ListBox.ItemTemplate>
            <DataTemplate>
                <ComboBox Name="comboBox1" 
                      DataContext="{Binding Combox}" 
                      ItemsSource="{Binding Comboxes}" 
                      DisplayMemberPath="PV" 
                      SelectedValuePath="PK"                  
                      SelectedItem="{Binding SelectedItem}"
                      VerticalAlignment="Top" 
                      Width="120" />        
            </DataTemplate>
        </ListBox.ItemTemplate>            
    </ListBox>

我很难过,因为它很难弄清楚如何在没有列表框的情况下让所选对象出现......

1 个答案:

答案 0 :(得分:1)

ItemsControl的项目中,DataContext是当前模板化的项目,如果您想要获取用作{{1} ItemsSource的列表您通常需要修改绑定以使用其他源,例如RelativeSourceElementName。 (这是用于所有ComboBoxes

的一个列表的情况

在这种情况下,如果列表似乎是项目的一部分,您只需要删除ComboBoxes上的绑定,因为DataContext已经是项目({DataContext的实例1}})。