2017-04-14 58 views
0

我已经定义一个类,如:如何将数据从DataContext传递到WPF中的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"} /> 

但是,这似乎并没有正常工作。有任何想法吗?

+0

你正在使用什么? – Valkyrie

回答

1

让我来帮你做这个正确的方式亚历克斯建议。

创建一个列表,并填充它在视图模型这样

视图模型

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> 

这就对了 !!

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

通常在DataContext将是一个视图模型类,将包含代理列表;那么你可以将ItemsSource绑定到该列表。处理列表框的许多例子中的任何一个都会非常直截了当。如果列表本身是DataContext,那么不太确定绑定的外观应该如何。

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

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

0

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

你可以试试这个: 给一个名称,为exemle myUC 用户控件的属性添加到您的用户控件:

public List<Agent> AgentList { get; set; }; 

填写您的agentlist:

this.AgentList = //fill method 

并绑定你的像这样的列表框:

<ListBox 
Name="agentCategoryListBox" 
Grid.Row="2" 
Grid.Column="1" 
ItemSource="{Binding Path=AgentList, ElementName=myUC"} /> 
+0

我认为这是非常复杂的,并且从'正确'的方式分心,这是MVVM,我会更有帮助。我的想法是 :) –

0

得到你想要的东西的最快方法是:

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

的ItemsSource直接绑定您的DataContext(这是你的列表),然后您告诉您的列表框中显示属性类别。

但适当的方式将是:

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"} /> 
相关问题