Combobox在ListView中绑定WPF

时间:2016-11-30 00:34:53

标签: c# wpf xaml combobox

把头发拉出来。我无法将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

1 个答案:

答案 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>

结果:

enter image description here

然而,你想要的是一些东西,每个组合框的下拉数为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>

结果:

enter image description here

这需要大量的管道才能变得有用,但至少你已经填满了ComboBox ...