Коллекция StackPanel как ItemsSource ComboBox - PullRequest
0 голосов
/ 29 января 2012

У меня есть
коллекция StackPanel, каждый из которых включает в себя динамический набор элементов управления (на основе значений базы данных), я хочу установить их как ItemsSource некоторых ComboBox, например, у меня есть две базы данныхзначения, которые должны быть сгенерированы:

In DB i have these:
row 1=>Class [a] p [B] , [AB]vb
row 2=>Class tpy rbs=[sdfg],kssc[h] hm

, и каждый из них должен генерировать в виде столбца ComboBox, например, следующие:

In ComboBox I wanna generate these :
 ComboBoxItem 1 :Class [a textBox] p [a textBox] , [a textBox]vb
 ComboBoxItem 2 :Class tpy rbs=[a textBox].kssc[a textBox] hm

следующий код делает это правильно:*

Но я не могу установить TwoWay DataBindings для этого, поэтому я создал список StackPanel как поле класса cmbSource (который связан с ItemsSource ComboBox)

public partial class cmbSource
{
    #region Primitive Properties
    int iD;

    public virtual int ID
    {
        get
        {
            if (Title != null)
                ControlsCollection = SetControlsCollection(Title);
            return iD;
        }
        set
        {
            iD = value;

        }
    }

    private StackPanel SetControlsCollection(string ttl)
    {
        Regex exp = new Regex(@"\[\w*\]");
        StackPanel p = new StackPanel { Orientation = Orientation.Horizontal, FlowDirection = System.Windows.FlowDirection.LeftToRight };
        int i = 0;
        foreach (string txt in exp.Split(ttl))
        {
            p.Children.Add(new TextBlock { Text = txt });
            if (i < exp.Matches(ttl).Count)
                p.Children.Add(new TextBox { Text = exp.Matches(ttl)[i].Value, Width = 30 });
        }
        return p;
    }

    public virtual string Title
    {
        get;
        set;
    }

    public virtual StackPanel ControlsCollection
    {
        get;
        set;
    }

    #endregion
}

но я понятия не имею, как связать его с ItemsSource моего ComboBox

Summery: я хочу связать список элементов управления с ComboBox любые предложения !?спасибо.

1 Ответ

4 голосов
/ 29 января 2012

EDIT

Первое: вы не привязываете ComboBox к коллекции элементов пользовательского интерфейса. Так не работает WPF. Контейнерные элементы управления, такие как Grid, StackPanel и Canvas, могут содержать дочерние элементы управления. ItemsControls, такие как ComboBox, содержат объекты данных и используют DataTemplates для отображения элементов.

Во-вторых: если база данных может содержать ЛЮБЫЕ данные, которые могут привести к необходимости ЛЮБОГО UI, вам нужно будет сгенерировать UI в коде, создав StackPanels и т. Д., Добавив элементы управления и привязки, как вы делаете в примерах кода.

В-третьих: причина, по которой вы не можете связать, состоит в том, что данные из базы данных - это строка, которую вы разбили на части; нет никакого способа, которым вы можете просто вернуться к строке.

Предложение: строка в базе данных, вероятно (я надеюсь) в каком-то формате. Используя эти знания, вы можете сгенерировать новую строку формата при разборе строки базы данных. Например, когда база данных содержит foo [bar], вы можете сгенерировать {0} [bar]. При сохранении действия пользователя вы можете использовать эту строку для создания обновленной строки для базы данных, используя: String.Format("{0} [bar]", someControl.Text)

Дополнительно: пожалуйста, в следующий раз используйте лучшие имена и примеры текстов; вопрос не читается вот так. Вы не можете ожидать от нас понимания 2=>Class tpy rbs=[sdfg],kssc[h] hm

СТАРЫЙ ОТВЕТ

Создайте класс Stuff, реализующий INotifyPropertyChanged и имеющий свойства Name и Value.

Загрузите данные базы данных в ObservableCollection<Stuff> и привяжите ComboBox к этой коллекции.

Установите для ItemTemplate поля со списком такую ​​табличку с данными:

<ComboBox ItemsSource="{Binding}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Name}"/>
                <TextBox Text="{Binding Value}"/>
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>
...