C# Key und Value sind leer? (ItemSource & Dictionary)

D

Dark-Water

Gast
Hallo ich habe da ein Problem, ich habe mir einen ColorPicker ComboBox für meine Modern-W8-App gebastelt und mittlerweile ist er auch schön schlank geworden, aber er funktioniert leider nur mit einen zusätzlichen Objekt.

Jetzt wollte ich dass ganz ohne Objekt und direkt mit einen Dictionary bauen,
aber ich komme nicht an Key und Value rann, bzw. sind Sie immer leer.

Bin für jede Hilfe dankbar :) :) :)

Ressourcen der Seite (in XAML)
Code:
    <Page.Resources>
        <DataTemplate x:Key="MyComboBoxColorTemplate">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="150"/>
                    <ColumnDefinition Width="50"/>
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" Text="{Binding Key}"/>
                <Rectangle Grid.Column="1" Fill="{Binding Value}"/>
                <Border Grid.Column="1" BorderThickness="1.5" BorderBrush="Black"/>
            </Grid>
        </DataTemplate>
    </Page.Resources>

Der eigentliche ComboBox Eintrag (einer von vielen, in XAML)
Code:
<ComboBox ItemsSource="{Binding}" ItemTemplate="{StaticResource MyComboBoxColorTemplate}"/>

und natürlich der Code (in C#):
Code:
            Dictionary<string, SolidColorBrush> allColors = new Dictionary<string, SolidColorBrush>();

            foreach(PropertyInfo color in typeof(Colors).GetRuntimeProperties())
                allColors.Add(color.Name, new SolidColorBrush((Color) color.GetValue(null)));

            this.DataContext = allColors;

wie gesagt Key und Value sind immer leer, aber es befinden sich 144 Einträge in der ComboBox, allerdings halt ohne Inhalt und mit farbloser Box.

Veileicht habt ihr ja ne Idee
Ergänzung ()

Hier mal die vorherige funktionierende Variante mit extra Object

Ressourcen der Seite (in XAML)
Code:
    <Page.Resources>
        <DataTemplate x:Key="MyComboBoxColorTemplate">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="150"/>
                    <ColumnDefinition Width="50"/>
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" Text="{Binding ColorName}"/>
                <Rectangle Grid.Column="1" Fill="{Binding ColorBrush}"/>
                <Border Grid.Column="1" BorderThickness="1.5" BorderBrush="Black"/>
            </Grid>
        </DataTemplate>
    </Page.Resources>

Der eigentliche ComboBox Eintrag (einer von vielen, in XAML)
Code:
<ComboBox ItemsSource="{Binding}" ItemTemplate="{StaticResource MyComboBoxColorTemplate}"/>

und natürlich der Code (in C#):
Code:
    public class ColorObject
    {
        public string ColorName { get; set; }
        public SolidColorBrush ColorBrush { get; set; }

        public ColorObject(PropertyInfo color)
        {
            ColorName = color.Name;
            ColorBrush = new SolidColorBrush((Color) color.GetValue(null));
        }
    }

    public sealed partial class ColorPage
    {
        public ColorPage()
        {
            List<ColorObject> allColors = new List<ColorObject>();

            foreach(PropertyInfo color in typeof(Colors).GetRuntimeProperties())
                allColors.Add(new ColorObject(color));

            InitializeComponent();

            this.DataContext = allColors;
        }
    }
 
Zuletzt bearbeitet von einem Moderator:
Das ist ein Bug. Du kommst nicht drum herum ein eigenes Objekt dafür zu nutzen. Wüsste aber auch ehrlich gesagt nicht, wieso du unbedingt ein Dictionary benutzen möchtest. Ob du jetzt ein KeyValuePair erzeugst oder dein Color-Objekt, ist gehopst wie gesprungen.
 
Ah okay , Danke!!! :)

schade das es nicht funktioniert :(

Ich schreibe aktuell meine App neu und möchte mich halt auch programmiertechnisch verbessern.
Dabei versuchen möglichst gut lesbaren und schlanken Code zu schreiben.
Und deswegen wäre schön gewesen wenn man halt auf das zusätzliche Objekt hätte verzichten können.

Denn ich möchte erst mal anständig C# programmieren, bevor ich mich an C++ wage.
(Die Sache des fehlenden GC unter c++ macht mir noch etwas sorgen :D )

MfG
 
Imho machst du die Sache da komplizierter als nötig.
Ich würde das einfach so machen, dann kannst du auf ein eigenes Template und nen eigenen
Datentyp verzichten:
Code:
colorPicker.ItemsSource = typeof(Colors).GetProperties().Select(x =>
{
    return new ComboBoxItem()
    {
        Background = new SolidColorBrush((Color)x.GetValue(null, null)),
        Content = x.Name
    };
});
 
Zurück
Oben