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
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
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
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
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