2012-03-25 5 views
1

ich habe diese benutzerdefinierte Listbox, die ich mit Microsoft Expression Blend erstellt, die drei Elemente (ein Bild, einen Namen und einen Text) enthält .. und das ist die Code der ListBox Vorlage !!wie ein neues Element in einer benutzerdefinierten Listbox programmgesteuert mit C#

<DataTemplate x:Key="ListBoxTemplate"> 
    <Grid Width="320" Height="80" Background="#FFCAE5DE"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="60"/> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="70"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 
     <Path Grid.ColumnSpan="1" Data="M8.4999981,6.8212103E-13 L256.5,6.8212103E-13 C261.19443,-1.8775456E-06 265,3.8055778 265,8.4999981 L265,55.499998 C265,60.194418 261.19443,63.999998 256.5,63.999998 L52.689537,63.999998 52.702888,75.988852 45.902157,63.999998 8.4999981,63.999998 C3.8055797,63.999998 0,60.194418 0,55.499998 L0,8.4999981 C0,3.8055778 3.8055797,-1.8775456E-06 8.4999981,6.8212103E-13 z" 
          Fill="#FF3E977D" Height="Auto" Margin="5,5,8,-11" StrokeStartLineCap="Round" Stretch="Fill" StrokeEndLineCap="Round" StrokeDashCap="Round" Stroke="Black" StrokeThickness="0" 
          StrokeLineJoin="Round" VerticalAlignment="Stretch" Grid.Column="1" Opacity="0.535" /> 
     <Border Margin="10,5,0,-2" BorderBrush="Black" BorderThickness="1" Height="Auto" CornerRadius="4"> 
      <Image Source="{Binding Path=ImageURL}" Stretch="Fill" Width="Auto" Height="Auto" /> 
     </Border> 

     <StackPanel Orientation="Horizontal" TextBlock.FontWeight="Bold" Height="Auto" Width="Auto" Grid.Column="1" Margin="5,5,0,-11"> 
      <TextBlock Text="{Binding Path=Text}" Width="400" Margin="3,2,0,16" Height="Auto" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" TextAlignment="Justify" TextWrapping="Wrap" ScrollViewer.HorizontalScrollBarVisibility="Auto"/> 
     </StackPanel> 

     <StackPanel Margin="0,47,43.5,-51" Grid.Column="1" Height="Auto" HorizontalAlignment="Stretch" Width="Auto" Grid.Row="1"> 
      <TextBlock Text="{Binding Path=Name}" Height="20" Margin="60,20,8,0" Width="Auto"/> 
     </StackPanel> 
    </Grid> 
</DataTemplate> 

wie Sie sehen können, ich habe drei Bindungen (ImageURL, Text und Namen). Nun möchte ich eine Methode in C# implementieren, die es mir erlaubt, ein neues Element in dieser Listbox hinzuzufügen. Und als erstes habe ich ein paar Beispiele gefunden, wie ich lisboxitem mit C# hinzufügen kann, aber ich weiß nicht, wie ich es mit meiner angepassten Listbox anwenden soll ... die Methode in C# war so etwas!

private ListBoxItem AddItem(string imageUrl, string text, string name) 
{ 
    ListBoxItem item = new ListBoxItem(); 
    /* the 
     code 
     of 
     the 
     customized 
     ListBox */ 
    item.content = content; 
    return item; 
} 

ist die Frage, wie kann ich ein neues Element in dem angepassten Listenfeld hinzufügen, wenn ich die Methode AddItem(imageUrl, text, name) nennen?

Alle Ideen .. Jede Hilfe wäre mehr als geschätzt.

@Margnus Johnansson vielen Dank für die Lösung. aber immer noch ein problem .. was wenn ich mehrere einzelteile hinzufügen möchte, was soll ich tun? !! diese ist die Methode, die ich realisiert habe ..

public void Additem(string imageUrl, string text, string name) 
    { 
     ObservableCollection<Person> Items = new ObservableCollection<Person>(); 

     MyListBox.ItemsSource = Items; 

     Items.Add(new Person() { Image = imageUrl, Text = text, Names = name }); 
    } 

diese Methode nur ein Element hinzufügt, selbst wenn ich es nennen mehrere Male, aber mein Ding ist, dass ich ein neues Element in der List i jedes Mal hinzufügen möchten Rufen Sie die Methode

Additem(string imageUrl, string, text, string name) 

ohne die anderen Elemente zu überschreiben !!

danke für das Verständnis.

+0

Sie sollten in Ihrer Add-Methode keine ObservableCollection erstellen. Setzen Sie das globale zum Beispiel auf die Page/Window im Konstruktor. Aus diesem Grund sehen Sie das beschriebene Problem, da Sie es jedes Mal zurücksetzen und löschen, wenn Sie ein Element hinzufügen. Während Sie dabei sind, verschieben Sie auch die Zuordnung MyListBox.ItemsSource nach draußen (zum Beispiel in Ihrem Konstruktor oder Seite laden) –

+0

Problem gelöst dank Ihnen! – Iyad009

Antwort

3

Sie sollten wirklich einen Blick auf Databinding werfen, es wird viel helfen.

Die Grundlagen ist, dass Sie ein Modell erstellen, das ein Element darstellt:

public class MyItem 
{ 
    public string ImageUrl { get; set; } 
    public string Text { get; set; } 
    public string Name { get; set; } 
} 

und dann erstellen Sie eine bindungsfähige Sammlung dieser Modellelemente:

ObservableCollection<MyItem> Items{get;set;} 

und binden Ihre Listview zu dieser Sammlung :

Items = new ObservableCollection<MyItem>(); 
myListBox.ItemsSource = Items; 

Schließlich können Sie Elemente wie folgt hinzufügen:

Items.Add(new MyItem() { ImageUrl = "http://..", Text = "My Text", Name = "My Name" }); 

Aufgrund der leistungsfähigen Datenbindung, die List-Box sollte Pickup die Änderungen an der Sammlung gemacht haben, und Sie sollten das neue Element in der List-Box sehen.

+0

Wow Mann, das ist Genie !! das funktioniert wirklich, aber immer noch ein Problem..was wenn ich mehrere Artikel hinzufügen möchte? !! was soll ich tun ? – Iyad009

+0

Ich habe Ihr Problem in einem Kommentar zu Ihrer Frage angesprochen. –