C# 基于DataTable列表在WPF中生成几个组合框
我想基于数据表列表创建动态组合框。 每次我向列表中添加一个新的datatable时,我都希望UI生成一个新的组合框,其中显示我从表中指定的列。我尝试了itemscontrol和datatemplate,但效果不理想C# 基于DataTable列表在WPF中生成几个组合框,c#,wpf,xaml,data-binding,datatemplate,C#,Wpf,Xaml,Data Binding,Datatemplate,我想基于数据表列表创建动态组合框。 每次我向列表中添加一个新的datatable时,我都希望UI生成一个新的组合框,其中显示我从表中指定的列。我尝试了itemscontrol和datatemplate,但效果不理想 public List<DataTable> DtList { get { return dtList; } set { dtList = value; } } <ItemsControl ItemsSource=
public List<DataTable> DtList
{
get { return dtList; }
set { dtList = value; }
}
<ItemsControl ItemsSource="{Binding Path=DtList}" >
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate >
<DataTemplate>
<ComboBox
VerticalContentAlignment="Center"
HorizontalContentAlignment="Left"
Margin="0,0,4,10"
Width="200"
BorderBrush="{DynamicResource ListBox.Static.Border}"
ItemsSource="{Binding DataSet}"
DisplayMemberPath="Element Name"
SelectedValuePath="ResourceType Name"
SelectedValue="{Binding SelectedRelationPath, Mode=TwoWay}"
/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
公共列表DtList
{
获取{return dtList;}
设置{dtList=value;}
}
我想您的组合框项目绑定错误。在调试下打开表单时,VS输出窗口中是否存在wpf绑定错误
您已将ItemsControl
绑定到DtList
属性。这很好,应该为列表中的每个项目创建组合框。您是否在运行时为DtList
中的每条记录创建了组合框
但是,combobox项绑定对我来说并不正确。每个组合框都将DtList
项作为数据上下文。但是您像ItemsSource=“{Binding DataSet}”
一样绑定了它。这使得combobox可以从DataTable.DataSet
属性中读取项
请尝试更改组合框项目绑定,如
ItemsSource=“{binding Rows}”
我刚刚创建了一个示例,它对我有用
public partial class MainWindow : Window, INotifyPropertyChanged
{
public MainWindow()
{
// this.DataContext = this; Uncomment this if code behind is your datacontext
InitializeComponent();
DataTable t1 = new DataTable();
t1.Columns.Add("Name");
t1.Columns.Add("Age");
t1.Rows.Add("A", "1");
t1.Rows.Add("B", "2");
DataTable t2 = new DataTable();
t2.Columns.Add("Name");
t2.Columns.Add("Age");
t2.Rows.Add("A", "1");
DtList = new List<DataTable> { t1, t2 };
}
private List<DataTable> dtList;
public List<DataTable> DtList
{
get { return dtList; }
set
{
dtList = value;
OnPropertyChanged("DtList");
}
}
private string selectedName;
public string SelectedName
{
get { return selectedName; }
set
{
selectedName = value;
OnPropertyChanged("SelectedName");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler == null) return;
handler(this, new PropertyChangedEventArgs(name));
}
}
现在做这个
<StackPanel>
<ItemsControl ItemsSource="{Binding Path=DtList}" >
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate >
<DataTemplate>
<ComboBox
VerticalContentAlignment="Center"
HorizontalContentAlignment="Left"
Margin="0,0,4,10"
Width="200"
ItemsSource="{Binding}"
DisplayMemberPath="Name"
SelectedValuePath="Age"
SelectedValue="{Binding Path=SelectedName,ElementName=windowName}"
/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
这对我来说很好。按照您所说的方式编辑它仍然不起作用没有生成组合框请检查
DtList
列表中是否有某些项目。添加新控件(如listbox)并绑定其项源,以检查列表中是否填充了项ItemsSource=“{Binding Path=DtList}”
。如果在显示表单(如单击按钮)后加载了表,则应在视图模型类中使用ObservableCollection DtList
。谢谢!现在它对我起作用了。您知道为什么所选值在我的类中找不到属性吗?它现在只显示datatable Classis的属性。在这种情况下,您有多个组合框。您需要将每个组合框的选定值绑定到每个属性,还是将所有组合框的选定值绑定到单个属性?对于单个属性,我已经编辑了代码,请查看。如果你做对了,请投票。仍然无法访问我的财产
<StackPanel>
<ItemsControl ItemsSource="{Binding Path=DtList}" >
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate >
<DataTemplate>
<ComboBox
VerticalContentAlignment="Center"
HorizontalContentAlignment="Left"
Margin="0,0,4,10"
Width="200"
ItemsSource="{Binding}"
DisplayMemberPath="Name"
SelectedValuePath="Age"
SelectedValue="{Binding Path=SelectedName,ElementName=windowName}"
/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>