locked
Template + Binding? RRS feed

  • Frage

  • Hallo,

    ich schreibe gerade eine einfache Website in Silverlight.

    Dazu brauche ich eine listbox mit meinen selbst erstellten listbox-items.

    also im XAML-Code sieht das so aus:

    <ListBoxItem x:Name="lbi1">
        <StackPanel HorizontalAlignment="Left" Orientation="Horizontal">
            <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,0,2,0">
                <Image Margin="2" HorizontalAlignment="Center" VerticalAlignment="Center" Source="{Binding Path=LinkIcon}"/>
            </StackPanel>
            <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
                <TextBlock TextWrapping="Wrap" Text="{Binding Path=Appname}" FontSize="16"/>
                <TextBlock TextWrapping="Wrap" Text="{Binding Path=LastUpdate}"/>
    		</StackPanel>
    	</StackPanel>
    </ListBoxItem>
    

    im Codebehind (C#) füge ich jetzt den DataContext hinzu:

    MyApplication myapp = new MyApplication("testApp", "19.08.2010", "/Assets/img/test.jpg")
    lbi1.DataContext = myapp;
    
    Dieser ist ein Object der selbst erstellten Klasse "MyApplication". (Über den Konstruktor legt man eben den Namen der Application, das letzte Update und den Link zu einem Screenshot fest)

    Das fuktioniert auch wunderbar (bis auf dass das bild nicht richtig angezeigt wird, aber dazu später).


    So jetzt möchte ich aber mehrere Items erstellen und habe deshalb ein DataTemplate erstellt:

    <DataTemplate x:Name="AppItemTemplate">
        <StackPanel HorizontalAlignment="Left" Orientation="Horizontal">
            <TextBlock Text="OK"/>
            <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,0,2,0">
              <Image Margin="2" HorizontalAlignment="Center" VerticalAlignment="Center" Source="{Binding Path=LinkIcon}"/>
            </StackPanel>
            <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
              <TextBlock TextWrapping="Wrap" Text="{Binding Path=Appname}" FontSize="16"/>
              <TextBlock TextWrapping="Wrap" Text="{Binding Path=LastUpdate}"/>
            </StackPanel>
        </StackPanel>
    </DataTemplate>
    

    und ein ListBoxItem:

    <ListBoxItem x:Name="lbi2" ContentTemplate="{StaticResource AppItemTemplate}"/>
    

    wenn ich jetzt den DataContext im Codebehind hinzufüge passiert aber einfach nix. Also es wird nixhts in der Listbox angezeigt.

    Was mach ich falsch? xD

    Danke für eure Hilfe!!!

     

    MfG

    Andi

     

    Samstag, 21. August 2010 17:43

Alle Antworten

  • Hallo Andi,

    wenn Du bewußt ein einzelnes ListBoxItem binden willst, solltest Du die ContentTemplate und Content Eigenschaft füllen:

    <ListBoxItem
       ContentTemplate="{StaticResource deinDataTemplate}" 
       Content="{Binding EinzelItemInstanz}"/>
    Normalerweise hat man aber mehrere ...

    ciao Frank
    Sonntag, 22. August 2010 09:26
  • Erstmal danke für deine Antwort!

    Naja das ist es eben, ich will nicht nur das eine item binden sondern ich möchte mehrere binden, die ich im Codebehind hinzufüge...

    Das soll dann so aussehen:

    ListBoxItem lbi = new ListBoxItem();
    lbi.ContentTemplate = <Hier kommt das Template>;
    MyApplication myapp = new MyApplication("testApp", "19.08.2010", "/Assets/img/test.jpg")
    lbi.DataContext = myapp;
    meineListBox.Add(lbi);

    aber das geht irgendwie nich.

    achja ich bin mir jetzt nicht sicher ob man im XAML-Code als Content-Eigenschaft andere Objekte als string binden kann, aber im Codebehind muss man eben die Eigenschaft DataContext nehmen, da eben Content an ein string-objekt gebunden ist...

    Das komische ist ja wenn ich das ohne Template mache (also in meinem ersten Beitrag XAML-Code Nr.1) dann geht das mit DataContext ohne Probleme. Nur kann ich dann halt keine Items im Codebehind in die ListBox hinzufügen...

    Dienstag, 24. August 2010 11:25
  • Ich habe ein ähnliches Probelm, deswegen schreib ich das gleich mal hier rein:

    Mit einem XamlReader füge ich zu meinem Projekt mehrere Canvas's zu einer LayerList:

    _LayerListe.Add(new Layer(CurrentLayer));
    
    -------
    
    public class Layer
      {
        public String LayerName { get; set; }
        public Canvas LayerCanvas { get; set; }
        
        public Layer(Canvas layerCanvas)
        {
          this.LayerName = layerCanvas.Name;
          this.LayerCanvas = layerCanvas;
        } 
      }
    

    Dann hab ich noch eine Listbox, welche per Binding den Namen des Canvas anzeigt:

    <ListBox x:Name="listBox_Layer" ItemsSource="{StaticResource LayerList}" Margin="10" VerticalAlignment="Top" MinWidth="150">
            <ListBox.ItemTemplate>
              <DataTemplate>
                <CheckBox Content="{Binding LayerName}" Click="CheckBox_Click" />
              </DataTemplate>
            </ListBox.ItemTemplate>
          </ListBox>
    
    Nun möchte ich die Visibility des Canvas an die Checkbox binden. Ich möchte somit das Canvas mit der Checkbox ein- und ausblenden können.

    Wie kann ich nun das Binding dazwischen machen?

    Mittwoch, 25. August 2010 13:54
  • Hallo Andi93,

    Schau Dir die folgende Diskussion an. Vielleicht findest Du etwas dass Dir weiter helfen kann.

    How to bind ListBox using Code Behind? or, How to add to ItemsSource programically once you have XAML markup?

    Grüße,

    Robert

    Dienstag, 31. August 2010 09:52
  • Ich hab jetzt schon verschiedene Varianten ausprobiert, aber bisher immernoch keine Lösung gefunden.
    Wie schon gesagt, ich hab diese Listbox:

          <ListBox x:Name="listBox_Layer" ItemsSource="{StaticResource LayerList}" Margin="10" VerticalAlignment="Top" MinWidth="150">
            <ListBox.ItemTemplate>
              <DataTemplate>
                <CheckBox Content="{Binding LayerName}" Click="CheckBoxClick" Loaded="CheckBoxLoaded"/>
              </DataTemplate>
            </ListBox.ItemTemplate>
          </ListBox>
    

    und dann folgendes Stück im Code-Behind:

        private void CheckBoxLoaded(object sender, RoutedEventArgs e)
        {
          Binding bind = new Binding("Visibility");
    
          CheckBox loadedCheckBox = (CheckBox)sender;
     
          bind.ElementName = loadedCheckBox.Content.ToString();
          bind.Mode = BindingMode.TwoWay;
          
          loadedCheckBox.SetBinding(ToggleButton.IsCheckedProperty, bind);
        }
    

    Leider scheint dies aber nicht zu funktionieren.

     

    Ich hoffe, jemand kann mir sagen, woran es liegt, da ich eigentlich keinen Fehler entdecken kann.

    Donnerstag, 16. September 2010 08:26