StackPanel的集合作为ComboBox的ItemsSource

时间:2012-01-29 09:37:55

标签: wpf data-binding wpf-controls

我有 StackPanel的集合,每个集合包含一组动态控件(基于数据库值),我想将它们设置为某些ItemsSource的{​​{1}} 例如,我有两个应该生成的数据库值:

ComboBox

并且每个应生成一个ComboBox列,如下图:

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

以下代码执行此操作:

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

但我无法为此设置Class ConvertToControlsFormat() { Regex exp = new Regex(@"\[\w*\]"); var source = new TestEntities().cmbSources; foreach (var item in source) { StackPanel p = new StackPanel { Orientation = Orientation.Horizontal, FlowDirection = FlowDirection.LeftToRight }; int i = 0; foreach (string txt in exp.Split(item.Title)) { p.Children.Add(new TextBlock { Text = txt }); if (i < exp.Matches(item.Title).Count) p.Children.Add(new TextBox { Text = exp.Matches(item.Title)[i].Value, Width = 30 }); } cmb.Items.Add(p); } } TwoWay,因此我创建了一个DataBindings列表作为StackPanel类的字段(绑定到{的{1}} {1}})

cmbSource

但我不知道如何将其绑定到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 有什么建议!?谢谢。

1 个答案:

答案 0 :(得分:4)

修改

首先:您没有将ComboBox绑定到UI元素集合。这不是WPF的工作方式。诸如Grid,StackPanel和Canvas之类的容器控件可以包含子控件。诸如ComboBox之类的ItemsControl包含数据对象,并使用DataTemplates显示项目。

其次:如果数据库可以包含任何可能导致需要任何UI的数据,则需要通过创建StackPanel等来生成代码中的UI,并像在代码示例中一样添加控件和绑定。

第三:你无法绑定的原因是数据库中的数据是一个你分成几部分的字符串;没有办法你可以简单地回到字符串。

建议:数据库中的字符串可能(我希望)采用某种格式。使用该知识,您可以在解析数据库字符串时生成新的格式字符串。例如,当数据库包含foo [bar]时,您可以生成{0} [bar]。在用户的保存操作上,您可以使用该字符串为数据库创建更新的字符串:String.Format("{0} [bar]", someControl.Text)

额外:请下次使用更好的名字和示例文本;这个问题是不可读的。您无法指望我们理解2=>Class tpy rbs=[sdfg],kssc[h] hm

OLD ANSWER

创建一个类Stuff,实现INotifyPropertyChanged并具有Name和Value属性。

将数据库数据加载到ObservableCollection<Stuff>并将ComboBox绑定到此集合。

将组合框的ItemTemplate设置为datatemplate,如下所示:

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