我尝试创建System.Windows.Window
以允许用户将用户输入的食物映射到预先选定的类别数。例如,用户键入“apple”然后从下拉列表中选择Fruit,然后键入“banana”并选择Fruit,然后键入“carrot”并选择Vegetable等(一对多映射)。为此我相信我需要一个文本框和一个下拉列表,包含一个ListView或GridView。
我想做DataBinding让这更容易,但由于我是WPF的新手,即使是简单的东西也很难(更不用说像我所描述的那样创造复杂的情况)。为了使事情变得更复杂,Window需要能够加载用户以前的选择。我假设我需要传递给Window构造函数两件事,做成公共属性(用于访问DataBinding):
填写类别下拉列表的所有可能类别的列表。例如,
this.Category = new List<string>{ "Fruit", "Vegetable", "Grain" };
先前选择的词典(将“食物”字符串映射到其中一个类别)。在这个例子中,
this.PriorSelections = new Dictionary< string, string >() { {"banana", "fruit"} };
如何在.NET 3.0中使用数据绑定在WPF中实现此目的? GridViewColumn声明是我现在最困难的地方,但非常欢迎所有其他见解。如果GridView或ListView是不正确的容器,请告诉我另一个容器是否最好。谢谢!
答案 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观察列表对象中。