Связывание ComboBox в ListBox - PullRequest
       20

Связывание ComboBox в ListBox

1 голос
/ 15 сентября 2011

Я не могу понять это. Если у меня просто не будет встроенного комбинированного окна в списке, оно заполнит и выберет нужные мне значения.

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 Ответ

1 голос
/ 15 сентября 2011

Внутри элементов ItemsControl DataContext находится элемент с точно заданным шаблоном, если вы хотите получить список, который будет использоваться как ItemsSource для ComboBoxes, вам обычно нужно изменитьпривязки для использования другого источника, например RelativeSource или ElementName.(Это относится к одному списку, который должен использоваться для всех ComboBoxes)

В этом случае, когда список представляется частью элемента, вам нужно только удалить привязку наDataContext, поскольку DataContext уже является элементом (экземпляр Combox).

...