none
ItemSource-Eigenschaft WPF RRS feed

  • Frage

  • Hallo,

    ich möchte einer Combobox bzw. einer Listbox eine Liste als Itemsource übergeben.

    <Window x:Class="Noteable.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:Noteable"
          xmlns:sys="clr-namespace:System;assembly=mscorlib"
         
            Title="MainWindow" Height="350" Width="525" Loaded="EditWindowLoaded">
        
       
        
        
        
        
        
        <DockPanel>
            <ListBox DockPanel.Dock="Left" BorderBrush="Black" BorderThickness="1" ItemsSource="" SelectedIndex="0"></ListBox>
            <DockPanel DockPanel.Dock="Right">
                <RichTextBox DockPanel.Dock="Left" Margin="10"></RichTextBox>
                <StackPanel DockPanel.Dock="Right" Margin="5">
                    <ComboBox Name="Sizebox"></ComboBox>
                    
                </StackPanel>
            </DockPanel>
             
        </DockPanel>
    </Window>
    


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Collections.ObjectModel;
    namespace Noteable
    {
        class NoteableCore
        {
            ObservableCollection<Note> notes = new ObservableCollection<Note>();
            List<Int32> fontsizelist = new List<int>();
            public NoteableCore()
            {
                for (int i = 0; i < 50; i = i + 2)
                {
                    fontsizelist.Add(i);
                }
            }
        }
    }
    

    Ich möchte die Eingenschaft in XAML zuweisen. Habe schon alles mögliche probiert:

    Bidnung

    StaticResource etc.

    Bisher hat noch nichts funktioniert.

    Sonntag, 27. September 2015 09:30

Antworten

  • Hallo,

    Schritt eins ist dass du eine öffentliche Eigenschaft anlegst die über den DataContext erreichbar ist. Beim MVVM Pattern würde man dafür eine eigene Klasse anlegen, wenn du das aber nicht einsetzt kannst du dem DataContext auch die Klasseninstanz des Fensters zuweisen und darin die Eigenschaft erstellen. Für mich sieht es erstmal so aus als würde NoteableCore dein DataContext werden sollen.

    namespace Noteable
    {
        public class NoteableCore
        {
            public ObservableCollection<Note> Notes{get;private set;}
            public ObservableCollection<Int32> FontSizeList{get;private set;}
    
            public NoteableCore()
            {
                Notes = new ObservableCollection<Note>();
                FontSizeList = new ObservableCollection<int>();
                for (int i = 0; i < 50; i = i + 2)
                {
                    FontSizeList .Add(i);
                }
            }
        }
    }


    Diese ObservableCollection-Eigenschaften werden im Konstruktor zugewiesen und haben nur einen privaten Setter. Wenn du diese später nochmal komplett neu zuweisen willst müsstest du noch die INotifyPropertyChanged-Schnittstelle implementieren um die Oberfläche auch diese Änderung nochmal mitzuteilen. Sofern du aber die Eigenschaft nur im Konstruktor zuweist ist das kein Problem.

    Nun musst du den DataContext zuweisen:

    public MainWindow(){
        this.DataContext = new NoteableCore();
        InitializeComponents();
    }

    Genauso gut kannst du diese Eigenschaft aber auch im XAML zuweisen sofern du noch einen XMLNS auf den Noteable-Namespace setzt und dort dann die Klasse anlegst:

    <Window.DataContext>
      <noteable:NoteableCore />
    </Window.DataContext>

    Wenn du nun ein Binding ohne Elementname oder Source angibst wird die in Path angegebene Eigenschaft im DataContext des darüber liegenden Elements gesucht. Sollte das Element keine DataContext-Eigenschaft zugewiesen haben wird im DataContext dessen übergeordneten Elements gesucht. Das klingt vielleicht kompliziert, ist aber eigentlich sehr einfach:

    <ListBox ItemsSource="{Binding Notes}" ...
    Du musst einfach nur {Binding Eigenschaftenname} schreiben.



    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert R3turnz Montag, 28. September 2015 09:45
    Sonntag, 27. September 2015 10:21
    Moderator