把头发拉出来。我无法将combobox
内的listview
绑定到后面代码中的列表。
combobox
甚至没有出现在列中..
希望combobox
中的listview
显示数字0-24。
XAML:
<ListView Grid.Row="0" Margin="0,0,0,0" Height="250" Width="540" SelectionMode="Single" dd:DragDrop.IsDragSource="True" dd:DragDrop.IsDropTarget="True" x:Name="TasksList">
<ListView.View>
<GridView>
<GridViewColumn Header ="Day 1" Width="50">
<GridViewColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Path=ComboBox1}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
代码背后:
public partial class TaskHoursRemaining : Page {
List<int> hourOfDay = new List<int>();
public TaskHoursRemaining() {
InitializeComponent();
LoadData();
DataContext = this;
}
private void LoadData() {
for (int i = 0; i < 25; i++) {
hourOfDay.Add(i);
}
this.ComboBox1.ItemsSource= hourOfDay;
}
}
但当前上下文中不存在ComboBox1
。
答案 0 :(得分:2)
在您的XAML中,您将绑定到不存在的属性ComboBox1
:
<ComboBox ItemsSource="{Binding Path=ComboBox1}"/>
在您的代码隐藏中,您正在访问不存在的字段ComboBox1
:
this.ComboBox1.ItemsSource= hourOfDay;
DataContext = this;
语句对您没有任何帮助。
要通过XAML创建字段,您应该使用x:Name
属性。无论如何,这都无济于事,因为ComboBox
位于模板中。
@ un-lucky是正确的,您应该将列表视图绑定到集合(事实上,您在代码隐藏中尝试做的事情)。然后,ComboBox 也想要一个集合,所以你应该正确拥有一个集合的数据模型。 (排序 - 所有组合框都需要相同的集合;只有选定的项目会有所不同。)
让我们首先使用TextBox
而不是ComboBox
来完成这项工作。该列表绑定到hourOfDay
,而TextBox
显示int
:
private readonly List<int> hourOfDay = new List<int>();
public MainWindow()
{
InitializeComponent();
for (int i = 0; i < 25; i++)
{
this.hourOfDay.Add(i);
}
this.TasksList.ItemsSource = this.hourOfDay;
}
XAML:
<ListView Grid.Row="0" Margin="0,0,0,0" Height="250" Width="540" SelectionMode="Single" x:Name="TasksList">
<ListView.View>
<GridView>
<GridViewColumn Header ="Day 1" Width="50">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding Mode=OneWay}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
结果:
然而,你想要的是一些东西,每个组合框的下拉数为1-24。我不知道可能是什么东西 - 也许是这样的:
public class Entry
{
private static readonly List<int> hourOfDay;
static Entry()
{
hourOfDay = new List<int>();
for (int i = 0; i < 25; i++)
{
hourOfDay.Add(i);
}
}
public IEnumerable<int> HourOfDaySource => hourOfDay;
}
在窗口/页面构造函数中:
InitializeComponent();
this.TasksList.ItemsSource = new List<Entry>
{
new Entry(),
new Entry(),
new Entry(),
new Entry(),
new Entry(),
};
XAML:
<ListView Grid.Row="0" Margin="0,0,0,0" Height="250" Width="540" SelectionMode="Single" x:Name="TasksList">
<ListView.View>
<GridView>
<GridViewColumn Header ="Day 1" Width="60">
<GridViewColumn.CellTemplate>
<DataTemplate DataType="wpf:Entry">
<ComboBox
ItemsSource="{Binding HourOfDaySource, Mode=OneWay}"
SelectedIndex="12"
Width="42"
/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
结果:
这需要大量的管道才能变得有用,但至少你已经填满了ComboBox
...