如何在 WPF 中将数据从 DataContext 传递到 ListBox



我有一个定义如下的类:

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;
  }
}

最新更新