将集合数据绑定到标签和下拉列表

时间:2014-03-19 15:53:30

标签: c# wpf gridview data-binding drop-down-menu

我尝试创建System.Windows.Window以允许用户将用户输入的食物映射到预先选定的类别数。例如,用户键入“apple”然后从下拉列表中选择Fruit,然后键入“banana”并选择Fruit,然后键入“carrot”并选择Vegetable等(一对多映射)。为此我相信我需要一个文本框和一个下拉列表,包含一个ListView或GridView。

我想做DataBinding让这更容易,但由于我是WPF的新手,即使是简单的东西也很难(更不用说像我所描述的那样创造复杂的情况)。为了使事情变得更复杂,Window需要能够加载用户以前的选择。我假设我需要传递给Window构造函数两件事,做成公共属性(用于访问DataBinding):

  1. 填写类别下拉列表的所有可能类别的列表。例如,

    this.Category = new List<string>{ "Fruit", "Vegetable", "Grain" };
    
  2. 先前选择的词典(将“食物”字符串映射到其中一个类别)。在这个例子中,

    this.PriorSelections = new Dictionary< string, string >() { {"banana", "fruit"} };
    
  3. 如何在.NET 3.0中使用数据绑定在WPF中实现此目的? GridViewColumn声明是我现在最困难的地方,但非常欢迎所有其他见解。如果GridView或ListView是不正确的容器,请告诉我另一个容器是否最好。谢谢!

1 个答案:

答案 0 :(得分:1)

使用可由用户填写的DataGrid的小例子:

<Window x:Class="TestWpfProject.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:TestWpfProject="clr-namespace:TestWpfProject"
        Title="MainWindow" Height="213" Width="404"
        DataContext="{Binding RelativeSource={RelativeSource Self}}"
        >
  <Grid>
    <DataGrid CanUserAddRows="True" CanUserDeleteRows="True" ItemsSource="{Binding Fruits}" AutoGenerateColumns="False">
      <DataGrid.Resources>
        <TestWpfProject:Categories x:Key="comboItems"/>
      </DataGrid.Resources>
      <DataGrid.Columns>
        <DataGridTextColumn MinWidth="100" Header="Name" Binding="{Binding Name}"/>
        <DataGridComboBoxColumn MinWidth="100" Header="Type" SelectedItemBinding="{Binding Category}" ItemsSource="{Binding CategoryList, Source={StaticResource comboItems}}"/>
      </DataGrid.Columns>
    </DataGrid>    
  </Grid>
</Window>

请注意Datacontext设置为self(MainWindow)=&gt; DataContext="{Binding RelativeSource={RelativeSource Self}}"

在您的代码中,您必须提供如下可绑定对象:

namespace TestWpfProject
{
  public partial class MainWindow : Window
  {
    public class Fruit
    {
      public string Name { get; set; }
      public string Category { get; set; }
    }

    public MainWindow()
    {
      Fruits = new ObservableCollection<Fruit>();
      InitializeComponent();
    }

    public ObservableCollection<Fruit> Fruits
    {
      get; set; 
    }
  }

  public class Categories
  {
    public List<string> CategoryList { get; set; }
    public Categories()
    {
      CategoryList = new List<string>() { "fruit", "vegetable", "grain" };
    }
  }
}

数据将存储在Fruits观察列表对象中。

enter image description here