Laden...

Label an ObservableCollection binden

Erstellt von Foyn vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.903 Views
F
Foyn Themenstarter:in
10 Beiträge seit 2012
vor 11 Jahren
Label an ObservableCollection binden

Hallo liebe Community,

nachdem ich nach längerer Suche keine Lösung gefunden habe möchte ich mich nun an euch wenden.

Problem:

Ich möchte den Content eines Labels an ein Element eines Objectes in einer Observablecollection binden.
Die gefunden Lösungsvorschläge mit einer ListBox an die meist eine ObservableCollection gebunden wird da ich jedes Label in eine andere Zelle eines Grids legen möchte womit ich einfach flexibler bin.

Folgend etwas Code der hoffentlich veranschaulicht was ich eigentlich möchte.

Die Klasse


public class Person : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;


protected void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
{
this.PropertyChanged(this, e);
}
}

private string firstname;
public string FirstName
{
get { return firstname; }
set
{
firstname = value;
OnPropertyChanged(new PropertyChangedEventArgs("FirstName";));
}
}
private string lastname;
public string LastName
{
get { return lastname; }
set
{
lastname = value;
OnPropertyChanged(new PropertyChangedEventArgs("LastName";));
}
}
}

**Die Observablecollection **
Die Daten die derzeit darin stehen machen nicht viel Sinn, das ist mir bewust, ich wollte bloß das Beispiel so einfach wie möglich halten.



public ObservableCollection<Person> ToBind;
public MainWindow()
{
InitializeComponent();

this.ToBind = new ObservableCollection<Person>;();
for (int i = 0; i < 10; i++)
{
this.ToBind.Add(new Person());
this.ToBind[i].FirstName = "First" + i.ToString();[/i]
this.ToBind[i].LastName = "Last" + i.ToString();[/i]
}

this.DataContext = ToBind;
}


XAML



<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*"></ColumnDefinition>
<ColumnDefinition Width="2*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="30"></RowDefinition>
<RowDefinition Height="30"></RowDefinition>
</Grid.RowDefinitions>

<Label Grid.Column="1" Grid.Row="0" Content="{Binding ToBind[0].FirstName}"></Label>
<Label Grid.Column="1" Grid.Row="1" Content="{Binding ToBind[0].LastName}"></Label>
</Grid>


Allerdings wird in den beiden Label nichts angezeigt.

Ich hoffe Ihr könnt mir bei meinem Problem helfen
Vielen Dank schon mal im Vorraus

T
314 Beiträge seit 2013
vor 11 Jahren

Hi,

wenn du die Applikation startest sollte im Output schon stehen, dass das Binding nicht funktioniert.

Denn du setzt den DataContext bereits auf die Collection. In diesem Fall sieht das Binding etwas merkwürdig aus:


<Label Grid.Column="1" Grid.Row="0" Content="{Binding [0].FirstName}"></Label>
<Label Grid.Column="1" Grid.Row="1" Content="{Binding [0].LastName}"></Label>

Dann funktioniert es auch mit dem Binding. Eine zweite Möglichkeit wäre den DataContext auf das MainWindow zu setzen und das Binding so zu lassen wie es ist. Das würde dann so aussehen:


        private ObservableCollection<Person> _toBind;
        public ObservableCollection<Person> ToBind
        {
            get { return _toBind; }
            set { 
                _toBind = value; 
            }
        }

        public MainWindow()
        {
            InitializeComponent();

            this.ToBind = new ObservableCollection<Person>();
            for (int i = 0; i < 10; i++)
            {
                this.ToBind.Add(new Person());
                this.ToBind[i].FirstName = "First" + i.ToString();
                this.ToBind[i].LastName = "Last" + i.ToString();
            }

            this.DataContext = this;
        }

Beste Grüße,
t0ms3n

F
Foyn Themenstarter:in
10 Beiträge seit 2012
vor 11 Jahren

sehr gut, vielen Dank für die kompakte antwort

mit


this.DataContext = this;

und


<Label Grid.Column="1" Grid.Row="0" Content="{Binding ToBind[0].FirstName}"></Label>

geht es bei mir leider nicht,
aber der 1. Weg ist für mich vollkommen ausreichend und funktioniert

Vielen Dank nochmal

mfg Foyn

F
Foyn Themenstarter:in
10 Beiträge seit 2012
vor 11 Jahren

Hallo t0ms3n,

ich habe nun versucht die Bindung im Code um zu setzen, allerdings geht diese nun nur "einmal", wenn sich die Liste ändert, ändert sich das Label nicht.

Kannst du mir nochmal weiterhelfen


Label labeltemp = new Label();
Grid.SetColumn(labeltemp, iColumn);
Grid.SetRow(labeltemp, iRow);

Binding bind = new Binding();
bind.Source = ToBind;
bind.UpdateSourceTrigger = UpdateSourceTrigger.Default;
bind.Path = new PropertyPath("[" + i.ToString() + "].FirstName");
i++;
labeltemp.SetBinding(ContentProperty, bind);

Vielen Dank schon mal
mfg Foyn

J
641 Beiträge seit 2007
vor 11 Jahren
Soo nich...

Wenn du die Labels eh im Code Behind erzeugst, warum willst du dann überhaupt noch an die Werte Binden, und weist nicht gleich den Wert deiner Property zu?

Ich würde eher die Liste an ein ListControl Binden. Du kannst dort auch ein Grid als ItemsContainer verwenden. siehe: http://stackoverflow.com/questions/2391251/using-a-grid-as-the-itemspanel-for-an-itemscontrol-in-silverlight-3

cSharp Projekte : https://github.com/jogibear9988