2017-04-14 1 views
0

Ich habe eine Klasse definiert wie:Wie Übermitteln von Daten von DataContext an ListBox in WPF?

public class Agent 
{ 
    public int Id { get; set; } 

    public string Category { get; set; } 

    // rest removed for brevity 
} 

Dann in WPF, ich die Daten als List bekommen und es zu DataContext wie dies passieren:

List<Agent> agents; // this includes my data 
this.DataContext = agents; 

Und in .xaml Teil möchte ich Liste das Category Feld jedes Objekts. Ich habe etwas in der Art:

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

Aber das scheint nicht richtig zu funktionieren. Irgendwelche Ideen?

+0

welche orm verwenden Sie? – Valkyrie

Antwort

1

Lassen Sie mich Ihnen helfen, diese in der richtigen Art und Weise zu tun, wie Alex vorgeschlagen.

eine Liste erstellen und es in Ansichtsmodell bevölkern wie diese

Ansichtsmodell

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

In XAML Machen Sie Ihre Liste und Datenvorlage wie folgt verwenden:

<Window.Resources> 
     <DataTemplate x:Key="AItemTemplate"> 
      <TextBlock Text="{Binding Category}"></TextBlock> 
     </DataTemplate> 
    </Window.Resources> 

<ListBox ItemsSource="{Binding agents}" 
     ItemTemplate="{StaticResource AItemTemplate}"></ListBox> 

Das ist es !!

0

Ich würde auch vorschlagen, dass Sie MVVM verwenden. Aber wenn du das nicht willst, dann probier das aus.

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

Normalerweise wird die Datacontext würde eine Ansicht Modellklasse, die die Liste der Agenten enthalten würde; Dann können Sie die ItemsSource an diese Liste binden. Jedes der vielen Beispiele, die sich mit Listbox beschäftigen, wird ziemlich einfach sein, wenn es darum geht. Nicht wirklich sicher, wie die Bindung aussehen sollte, wenn die Liste selbst der DataContext ist.

Wenn die ItemsSource auf eine Agentenliste eingestellt ist, können Sie DisplayMemberPath einfach auf "Category" setzen, wenn Sie die Kategorie in der Liste anzeigen möchten.

Ich schlage vor, in MVVM zu schauen und zu lernen, es anzuwenden, es ist ein unschätzbares Konzept meiner Meinung nach.

0

Sie versuchen, Ihre Listbox an eine Zeichenfolgeneigenschaft zu binden.

Sie können dies versuchen: einen Namen für exemle myUC Ihre Benutzersteuerung Geben Sie eine Immobilie zu Ihrer Benutzersteuerung hinzufügen:

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

Füllen Sie Ihre list:

this.AgentList = //fill method 

und binden Ihre Listenfeld wie folgt:

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

Ich denke, das ist unnötig kompliziert und lenkt von der "richtigen" Art ab, die MVVM ist, und was würde ich hilfreicher für die Zukunft sein. Meiner Meinung nach :) –

0

Der schnellste Weg zu bekommen, was Sie wollen, ist:

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

Itemssource binded wird direkt auf Ihrem Datacontext (die Liste), und Sie dann zu Ihrem ListBox erzählen die Immobilie Kategorie angezeigt werden soll.

Aber der richtige Weg gewesen wäre:

1 - Erstellen eines Datacontext

public class AgentsDC 
{ 
    public List<Agent> Agents { get; set; } 
} 

2 - Geben Sie diese Klasse als Datacontext

this.DataContext = new AgentsDC(); 

3 - binden all diese Dinge

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