我有一个定义如下的类:
public class Agent
{
public int Id { get; set; }
public string Category { get; set; }
// rest removed for brevity
}
然后,在 WPF 中,我List
获取数据并将其传递给DataContext
,如下所示:
List<Agent> agents; // this includes my data
this.DataContext = agents;
.xaml
部分中,我想列出每个对象的Category
字段。我有这样的东西:
<ListBox
Name="agentCategoryListBox"
Grid.Row="2"
Grid.Column="1"
ItemSource="{Binding Path=Category"} />
但这似乎无法正常工作。有什么想法吗?
让我按照亚历克斯的建议,以正确的方式帮助你做到这一点。
创建一个列表并在 ViewModel 中填充它,如下所示
视图模型
public class MainWindowViewModel : INotifyPropertyChanged
{
public MainWindowViewModel()
{
agents = new ObservableCollection<Agent>();
LoadData();
}
private void LoadData()
{
agents.Add(new Agent { Id = 1, Category = "a" });
agents.Add(new Agent { Id = 2, Category = "b" });
agents.Add(new Agent { Id = 3, Category = "c" });
}
}
在 XAML 中,创建列表并使用如下所示的数据模板:
<Window.Resources>
<DataTemplate x:Key="AItemTemplate">
<TextBlock Text="{Binding Category}"></TextBlock>
</DataTemplate>
</Window.Resources>
<ListBox ItemsSource="{Binding agents}"
ItemTemplate="{StaticResource AItemTemplate}"></ListBox>
就是这样!!
通常,DataContext 是一个包含代理列表的视图模型类;然后您可以将 ItemsSource 绑定到该列表。处理列表框的许多示例中的任何一个例子都将非常简单。不太确定如果列表本身是 DataContext,绑定应该是什么样子。
然后,一旦将 ItemsSource 设置为代理列表,如果要在列表中显示类别,更简单的方法是将 DisplayMemberPath 设置为"类别"。
我建议研究 MVVM 并学习应用它,在我看来这是一个非常宝贵的概念。
您尝试将列表框绑定到字符串属性。
你可以试试这个:为示例 myUC 的用户控件命名将属性添加到用户控件:
public List<Agent> AgentList { get; set; };
填写您的代理名单 :
this.AgentList = //fill method
并像这样绑定您的列表框:
<ListBox
Name="agentCategoryListBox"
Grid.Row="2"
Grid.Column="1"
ItemSource="{Binding Path=AgentList, ElementName=myUC"} />
这会给你一个想法:
http://www.c-sharpcorner.com/forums/wpf-datacontext-binding-with-listbox
获得所需内容的最快方法是:
<ListBox
Name="agentCategoryListBox"
Grid.Row="2"
DisplayMemberPath="Category"
Grid.Column="1"
ItemSource="{Binding Path=."} />
ItemsSource 直接绑定到你的数据上下文(这是你的列表(,然后你告诉你的列表框显示属性类别。
但正确的方法是:
1 - 创建数据上下文
public class AgentsDC
{
public List<Agent> Agents { get; set; }
}
2 - 将此类作为 DataContext
this.DataContext = new AgentsDC();
3 - 绑定所有这些东西
<ListBox
Name="agentCategoryListBox"
Grid.Row="2"
DisplayMemberPath="Category"
Grid.Column="1"
ItemSource="{Binding Path=Agents"} />
我也建议你使用 MVVM。但是,如果您不想,请尝试此操作。
XAML:
<ListBox Name="AgentCategoryListBox" ItemsSource="{Binding}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Category}" d:DataContext="{d:DesignData}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
.CS:
public MainWindow()
{
InitializeComponent();
List<Agent> agents = new List<Agent>
{
new Agent
{
Category = "Category"
}
};
DataContext = agents;
}
public class Agent
{
public string Category
{
get;
set;
}
}