none
Angabe des Databindings in xaml gesucht (für funktionierendes Binding im Code) RRS feed

  • Frage

  • Hallo,

    ich hab zwei DataBindings die ich im Code in InitializeComponents hinzufüge, da ich es mir nicht gelungen ist das ganze in xaml zu formulieren.
    Funktioniert soweit, aber mich würde interessieren wie ich diese Bindings in xaml angeben müsste:

    1 Beispiel:
    Ein UserControl enthält eine Property 'Klasse' die einen member 'Schüler' vom Typ ObservableCollection enthält. Binding der Schüler-Liste an eine ListView wird gewünscht:

    binding = new Binding();
    binding.Source = this.Klasse;
    binding.Path = new PropertyPath("Schüler");
    listView1.SetBinding(ListView.ItemsSourceProperty, binding);

    Wie müsste hier das Binding in xaml angegeben werden?

    2. Beispiel
    UserControl enthält eine Property 'Bild' vom Typ BitmapSource. Binding an ein Image-Control wird gewünscht:

    Binding binding = new Binding();
    binding.Source = this;
    binding.Path = new PropertyPath("Bild");
    image1.SetBinding(Image.SourceProperty, binding);

    Wie müsste hier das Binding in xaml angegeben werden?

    danke
    Torsten

    Montag, 4. April 2011 13:13

Antworten

  • Absolut - und das Laden der Daten machst du ohnehin im Code, am Ende baust du nur noch eine Referenz der Daten zu deinem WPF DataContext, da sehe ich kein Problem bzgl. der Schichtentrennung.
    Manuel Wenk - ProConnected Softwareentwicklung und Beratung MCAD, MCTS
    Freitag, 8. April 2011 07:49

Alle Antworten

  • Teste mal folgendes:


    <ListView x:Name="listView1" ItemSource="{Binding Path=Klasse.Schüler}">
    ...

    <Image x:Name="image1" Source="{Binding Path=Bild}"


    Wichtig ist, das du im Codebehind im Constructor noch den DataContext setzt:

    public Constructor()
    {
         this.InitializeComponents();

         this.DataContext = this;

    Achja noch so ein Tip am Rande, für Klassen-, Methoden- und anderen Deklarationen würde ich keine Umlaute verwenden, da es evtl. Probleme mit dem Compiler geben könnte.

    Dienstag, 5. April 2011 06:58
    Beantworter
  • Danke,

    zunächst: das mit den Umlauten war jetzt nur für das Beispiel.

    Gerade das setzen des DataContext im Code will ich nicht. Entweder ich mach das ganze Binding im code, oder alles in xaml.
    Teile des Bindings im Code zu haben und Teile im xaml - diese Vermischung gefällt mir nicht.

    Kann ich nicht auch für die DataSource ein Binding angeben. In der Art
    DataSource="{Binding....}".
    Hab da schon einiges probiert (FindAnchestor etc.). Hab es aber nicht hinbekommen.
    Oder ist das nicht möglich?

    ciao
    Torsten

     

    Mittwoch, 6. April 2011 07:53
  • Wenn du das ganze richtig sauber getrennt haben willst, dann musst du das MVVM Pattern anwenden.
    Dann kannst du das ViewModel im Xaml an die View binden.

    Hier ein Beispiel:

    ...

        <Window.Resources>
            <viewModels:ExampleViewModel x:Key="ViewModel"  />
        </Window.Resources>

    ...

        <Grid x:Name="LayoutRoot"
              DataContext="{Binding Source={StaticResource ViewModel}}" >

    ...

    Mittwoch, 6. April 2011 08:47
    Beantworter
  • Ich glaube nicht das du (ohne MVVM, geänderte Basisklassen o.ä.) um das setzen der ItemsSource oder des DataContext im Code herumkommst. Das Xaml/Baml wird ja normalerweise erst in der InitializeComponents geladen und kann nicht ohne weiteres eine Referenz zu deinen Klassenmembern herstellen.
    Manuel Wenk - ProConnected Softwareentwicklung und Beratung MCAD, MCTS
    • Als Antwort vorgeschlagen Manuel Wenk Freitag, 8. April 2011 07:49
    Donnerstag, 7. April 2011 17:44
  • Danke,

    im konkreten Fall gehts um allgemein verwendbare UserControls.
    Die Menge an Code hält sich in Grenzen, und da erscheint mir die _saubere_ Verwendung von MVVM ( oder MVP oder MVC) eher kontraproduktiv zu sein.

    schöndes Wochende

    Torsten

    Freitag, 8. April 2011 07:23
  • Absolut - und das Laden der Daten machst du ohnehin im Code, am Ende baust du nur noch eine Referenz der Daten zu deinem WPF DataContext, da sehe ich kein Problem bzgl. der Schichtentrennung.
    Manuel Wenk - ProConnected Softwareentwicklung und Beratung MCAD, MCTS
    Freitag, 8. April 2011 07:49