Entwickler-Ecke

WPF / Silverlight - WPF-DataGrid Binding dynamisch - KeyedCollection ?


funcry - Di 15.02.11 10:22
Titel: WPF-DataGrid Binding dynamisch - KeyedCollection ?
Liebes Forum,

Das folgende Binding ist Index-Basiert:


C#-Quelltext
1:
Path = new System.Windows.PropertyPath("Perc[" + i.ToString(System.Globalization.CultureInfo.CurrentCulture) + "]"null),                    


Gibt es eine Möglichkeit eines Bindings welches ähnlich wie ein dictionary oder einer KeyedCollection funktioniert, also etwa so:


C#-Quelltext
1:
Path = new System.Windows.PropertyPath("Perc[2011]"null),                    


Kha - Di 15.02.11 11:13

Wo soll nun der Unterschied zwischen den zwei Zeilen liegen :gruebel: ?
Falls du auf ein wirkliches Dictionary zugreifen willst: Geht nicht ohne TypeConverter. Wobei ich dann eher eine neue Property im DataContext anlegen würde.

C#-Quelltext
1:
2:
3:
public Foo CurrentFoo {
  get { return foos["thisfoo"]; }
}


funcry - Di 15.02.11 14:05

Zitat:
Wo soll nun der Unterschied zwischen den zwei Zeilen liegen ?


Das ist eine interessante Frage! Im ersten Fall ist es der Index von perc, im gewünschten Fall ist es eine jahreszahl, welche - da nummerisch - sich auch als index missbrauchen liese.

Das DataGrid wird hier gebunden:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
public class ResultsSession : INotifyPropertyChanged
{
    [...]
    public ReadOnlyCollection<int> Years { get; private set; }
    public ObservableCollection<double> Perc { get; private set; }
    [...]
}

Das Property Years enthält eine Auflistung von Jahreszahlen, zu denen die zusätzlichen dynamischen Spalten gebunden werden. Habe ich nun 5 Jahre, enthält Perc auch nur 5 Werte. Diese Zuweisung erfolgt an andere Stelle:


C#-Quelltext
1:
2:
3:
4:
5:
for (int i = 0; i < yearsCount; i++)
{
    int year = Years.Min() + i;
    Perc.Add(((100 * resultsDays.Where(p => p.Blub.Year == year).Sum(r => r.Bla)) / resultsDays.Where(p => p.Blub.Year == year).Sum(r => r.Bla)) - 100); 
}


Also irgenwie alles schon bisschen getrickst, und daher fehleranfällig.

Die Lösung die ich suche, müsste ein Binding zu meiner Klasse verwenden ohne zu tricksen. Also years könnte folgende Elemente enthalten: 2005, 2008, 2009. Zu diesen Spalten müsste ich dann die Ergebnisse in Perc speichern. z.B.:

C#-Quelltext
1:
2:
3:
Perc[2005] = 12,23
Perc[2008] = 10,58
Perc[2009] = 5,49


Dann wäre der Index gleich meiner Jahreszahl. Würde vermutlich funktionieren, bisschen mehr getrickst, aber vermutlich besser.