我有
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
有什么建议!?谢谢。
答案 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>