2016-04-08 3 views
0

Es gibt viele Fragen darüber, wie eine ObservableCollection über XAML an eine ListView gebunden wird. Ich brauche jedoch, wie man die Sammlung programmatisch an ListView bindet. Es gibt einige Fragen, die helfen, aber sie sprechen immer noch nicht genau an, was ich brauche.ObservableCollection programmgesteuert mit einer listView verknüpfen

Ich habe diese Klassen:

public class myTask 
{ 
    public DateTime TaskDate { get;} 
    public string TaskName { get;} 

} 
public class myTaskList : List<myTask> 
{ 
    public ObservableCollection<myTask> getMyTasks(DateTime d) 
    { 
     ObservableCollection<myTask> t = new ObservableCollection<myTask> 
         (this.Where(x => x.TaskDate == d).ToList<myTask>()); 
     return t; 
    } 
} 

Und ich möchte nur den Tasknamen des Ergebnisses der getMyTasks zu einer Listenansicht zur Laufzeit binden. Ich habe diesen Ansatz versucht:

ListView lv = new ListView(); 
    //assuming I declare myTaskList a static class 
    lv.DataContext = myTaskList.getMyTasks(DateTime.Now); 
    var binding = new Binding(); 
    binding.Source = lv; 
    lv.SetBinding(ListView.ItemsSourceProperty, binding); 

, dass nur die Ergebnisse in die Liste binden kann, wie kann ich nur binden Tasknamen in den Ergebnissen?

Antwort

1

Ich denke, ich habe endlich eine Lösung gefunden, die für mein Szenario anwendbar ist.

Es ist möglich, ein Feld eines ObservableCollection-Datensatzes mit mehreren Feldern an eine Listenansicht zu binden. Was wir tun müssen, ist eine Datenvorlage in der Ressource erklärt:

<DataTemplate x:Key='myTaskItemTemplate'> 
      <TextBlock x:Name='ItemTaskName' 
           FontSize='15' 
           HorizontalAlignment='Stretch' 
           VerticalAlignment='Stretch' 
           TextAlignment='Center' 
           Text='{Binding TaskName}' /> 
    </DataTemplate> 

dann die Listenansicht erstellen unter Verwendung der obigen Vorlage

ListView lv = new ListView { ItemTemplate = (DataTemplate)Resources["myTaskItemTemplate"] }; 

und dann eine Bindung mit der Quelle ist die ObservableCollection Dataset gebunden erstellen die ItemSourceProperty der Listenansicht

var t = myCalendarMonth.TaskList(d.theDate); 
    lv.DataContext = t; 
    var binding = new Binding(); 
    binding.Source = t; 
    lv.SetBinding(ListView.ItemsSourceProperty, binding); 

ich bin sicher, es kann viel bessere Lösungen da draußen sein, wie ich XAML bin sehr neu, aber der Ansatz diskutiert über scheint die Ergebnisse zu liefern, nach denen ich suche.

0

Ohne eine gute Minimal, Complete, and Verifiable example, die Ihre Frage klar veranschaulicht, ist es unmöglich zu wissen, welche Antwort Sie brauchen. Aber & hellip;

Es scheint hier keine verbindliche Operation zu sein. Der Binding-Code, den Sie anzeigen, erstellt eine zirkuläre Bindung (Bindung der -Objekt ItemsSource-Eigenschaft an sich), die nicht sinnvoll scheint. Mehr zu dem Punkt, sollten Sie in der Lage zu erreichen, was Sie wollen einfach durch die ItemsSource Eigenschaft zuweisen, und die DisplayMemberPath Eigenschaft:

lv.ItemsSource = myTaskList.getMyTasks(DateTime.Now); 
lv.DisplayMemberPath = "TaskName"; 

Keine Notwendigkeit, eine Bindung an alle zu schaffen.