locked
Data Binding an ein Listen-Element RRS feed

  • Frage

  • Hallo Leute, 

    da mir hier immer sehr schnell geholfen wurde, versuche ich mal wieder mein Glück.

    Ich möchte Controls an Listen-Elemente binden.

    Jedoch wird der Index nicht akzeptiert.

    Weder: 

    bind.Path = new PropertyPath(liste[0].PersonName);

    Noch: 

    this.DataContext = liste[0];
    Ziel ist es, dass ich mit +/- Buttons den Index inkrementieren/ dekrementieren möchte, und die Controls die entsprechenden Werte anzeigen.

    Ich danke im voraus für eure Lösungsvorschläge.
    Samstag, 2. Oktober 2010 15:32

Antworten

  • Hallo an alle, 

    danke noch einmal für eure Hilfe.

    Hier meine Lösung des Problems.

     

     

    Ich habe mir eine Converter geschrieben, welcher den aktuellen Index entgegen nimmt

    und mir das dafür entsprechende Listenelement zurück liefert.

     

    Beispiel:

     

    converter:

    public class IntConverter : IValueConverter

        {

            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

            {

                return App.historyNodeList2[System.Convert.ToInt32(value)];

            }

     

            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

            {

                return value.ToString();

            }

        }


    Binding an Listenelement in Abhängigkeit von einem globalen Index:
    - App._historyIndex ist von INotifyPropertyChanged  abgeleitet


    IntConverter IC = new IntConverter();

                    Binding bind = new Binding();

                    bind.Converter = IC;

                    bind.Source = App._historyIndex;

                    bind.Path = new PropertyPath("History_Index");

     

                    ColumnSeries bs = new ColumnSeries();

                    bs.SetBinding(ColumnSeries.ItemsSourceProperty, bind);


    Donnerstag, 28. Oktober 2010 10:44

Alle Antworten

  • HileWugel,
    binde Deine Elemente an eine Eigenschaft, die Dir das ausgewählte Element bereitstellt. Deine Navigationsbuttons ändern einen Index, der in der Eigenschaft zur Auswahl des Listenelementes herangezogen wird.

    --
    Viele Gruesse
    Peter

    Samstag, 2. Oktober 2010 16:07
  • Vielen Dank Peter,

    leider verstehe ich nicht, was du meinst.

    Könntest du bitte deine Antwort mit einer Zeile Code erläutern?

    Ich weiß nicht, wo/wie ich die "Liste[index]" als Quelle angeben kann.

    Vielen Dank

    Samstag, 2. Oktober 2010 16:25
  • Hier mal eine Demo:
     

    <UserControl x:Class="SilverlightApplication2.Usercontrol1"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
       xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
       mc:Ignorable="d"
       d:DesignHeight="300" d:DesignWidth="400"
           xmlns:my="clr-namespace:SilverlightApplication2">
     <UserControl.Resources>
      <my:ViewModel x:Key="vm"/>
      <Style TargetType="Button">
       <Setter Property="Margin" Value="5" />
       <Setter Property="Width" Value="100" />
      </Style>
     </UserControl.Resources>
     <StackPanel DataContext="{Binding Source={StaticResource vm}}">
      <Button Content="vorwärts" Click="Vorwaerts_Click" />
      <Button Content="rückwärts" Click="Rueckwaerts_Click" />
      <StackPanel DataContext="{Binding DetailView}">
       <TextBox Text="{Binding ID}"/>
       <TextBox Text="{Binding Inhalt}"/>
      </StackPanel>
     </StackPanel>
    </UserControl>
    

    Dazu die Klassen:

    Imports System.ComponentModel
    
    Public Class ViewModel
     Implements INotifyPropertyChanged
    
     Private m As New Model
     Private i As Integer = -1
    
     Public ReadOnly Property DetailView
      Get
       If i >= 0 And i < m.Count Then
        Return m(i)
       Else
        Return Nothing
       End If
      End Get
     End Property
    
     Public Sub Vorwaerts()
      i += 1
      If i >= m.Count Then i = -1
      RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("DetailView"))
     End Sub
    
     Public Sub Rueckwaerts()
      i -= 1
      If i < 0 Then i = -1
      RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("DetailView"))
     End Sub
    
     Public Event PropertyChanged(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
    End Class
    
    Public Class Model
     Inherits List(Of Datensatz)
     Public Sub New()
      For i = 1 To 9
       Me.Add(New Datensatz With {.ID = i, .Inhalt = String.Format("Zeile {0}", i)})
      Next
     End Sub
    End Class
    
    Public Class Datensatz
     Public Property ID As String
     Public Property Inhalt As String
    End Class
    

    --
    Viele Gruesse
    Peter

    • Als Antwort vorgeschlagen Robert Breitenhofer Mittwoch, 6. Oktober 2010 16:28
    • Als Antwort markiert le.wugel Donnerstag, 7. Oktober 2010 16:15
    • Tag als Antwort aufgehoben le.wugel Montag, 18. Oktober 2010 15:39
    Samstag, 2. Oktober 2010 18:31
  • Das funktioniert soweit, jedoch kommt es leider für mein Problem nicht als Lösung in Frage.

     

    Kurz zu dem, was ich erreichen möchte.

     

    Ich habe eine      List<List<Person>>    

    und eine public static int  _index :INotifyPropertyChanged    in der App.xaml.cs .

     

    Für jede List<Person> erzeuge ich einen Button

    -> click.event dieser öffnet einen PopUp

    -> Textboxes dieser PopUps sollen an Person-Propertys gebunden sein, 

    wobei der globale integer _index jeweils das gewünschte Person-Objekt indiziert.

     

    Beispiel:

    _index = 7

     

    button3.click erzeugt neues PopUp, dieses zeigt mir PersonPropertys von 

    List[3][7] an.

     

    button12.click erzeugt neues PopUp, dieses zeigt mir PersonPropertys von 

    List[12][7] an.

     

     

    Funktioniert alles soweit, NUR: 

    wenn _index sich jetzt ändert, soll sich dem entsprechend die AngezeigtenPersonPropertys in den Popups ändern.

    Vielen Dank für eure Hilfe

     

     

    Montag, 18. Oktober 2010 15:39
  • Hallo an alle, 

    danke noch einmal für eure Hilfe.

    Hier meine Lösung des Problems.

     

     

    Ich habe mir eine Converter geschrieben, welcher den aktuellen Index entgegen nimmt

    und mir das dafür entsprechende Listenelement zurück liefert.

     

    Beispiel:

     

    converter:

    public class IntConverter : IValueConverter

        {

            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

            {

                return App.historyNodeList2[System.Convert.ToInt32(value)];

            }

     

            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

            {

                return value.ToString();

            }

        }


    Binding an Listenelement in Abhängigkeit von einem globalen Index:
    - App._historyIndex ist von INotifyPropertyChanged  abgeleitet


    IntConverter IC = new IntConverter();

                    Binding bind = new Binding();

                    bind.Converter = IC;

                    bind.Source = App._historyIndex;

                    bind.Path = new PropertyPath("History_Index");

     

                    ColumnSeries bs = new ColumnSeries();

                    bs.SetBinding(ColumnSeries.ItemsSourceProperty, bind);


    Donnerstag, 28. Oktober 2010 10:44