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

时间:2017-04-14 08:57:02

标签: c# wpf xaml

我的课程定义如下:

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"} />

但这似乎无法正常工作。有什么想法吗?

6 个答案:

答案 0 :(得分:1)

通常,DataContext是一个视图模型类,它将包含代理列表;然后你可以将ItemsSource绑定到该列表。处理列表框的许多示例中的任何一个都非常直接。如果列表本身是DataContext,则不确定绑定应该如何。

然后,一旦ItemsSource设置为代理列表,如果要在列表中显示Category,更简单的方法是将DisplayMemberPath设置为“Category”。

我建议调查MVVM并学习应用它,在我看来这是一个非常宝贵的概念。

答案 1 :(得分:1)

让我帮助你按照亚历克斯建议的正确方式做到这一点。

创建一个列表并在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>

就是这样!!

答案 2 :(得分:0)

我也建议你使用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;
  }
}

答案 3 :(得分:0)

您尝试将列表框绑定到字符串属性。

你可以试试这个: 为exemle 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"} />

答案 4 :(得分:0)

答案 5 :(得分:0)

获得所需内容的最快方法是:

<ListBox
    Name="agentCategoryListBox"
    Grid.Row="2"
    DisplayMemberPath="Category"
    Grid.Column="1"
    ItemSource="{Binding Path=."} />

ItemsSource直接绑定到您的Datacontext(这是您的列表)然后您告诉您的ListBox显示属性Category。

但正确的方法是:

1 - 创建DataContext

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"} />