Zum Inhalt springen

[WPF]ComboBox, ItemTemplate, Problem mit Brush


TDM

Empfohlene Beiträge

Grüße,

ich bin grad dabei, ein kleines Optionsfenster für Individualisierungen zu schreiben. Unter Anderem sollen da bestimmte Farben zugewiesen werden können. Irgendwie klappt das aber noch nicht so ganz, wie ich will.

Zunächst hab ich erstmal mittels Helperclass die Enum der Farben erzeugt:

        <ObjectDataProvider x:Key="PropertyCollector" MethodName="GetPropNames" ObjectType="{x:Type local:PropertyCollector}">

            <ObjectDataProvider.MethodParameters>

                <x:Type TypeName="Colors"/>

            </ObjectDataProvider.MethodParameters>

        </ObjectDataProvider>
Hilfsmethode ist simpel:
        public IEnumerable GetPropNames(Type type)

        {

            foreach (PropertyInfo pi in type.GetProperties())

                yield return pi.GetValue(null, null);

        }
Passt auch soweit. Das ganze ist der ItemsSource für meine ComboBox:
<ComboBox Grid.Row="0" Grid.Column="1" Margin="5"

                  ItemsSource="{Binding Mode=OneWay, Source={StaticResource PropertyCollector}}" 

                  ItemTemplate="{StaticResource ColorTemplate}" 

                  SelectedItem="{Binding BackgroundColorOption.Value}"/>
Damit man auch was erkennt und nicht nur "#00000000"-Strings dastehen, soll als Repräsentation ein kleines Viereck, mit Farbe gefüllt, gezeichnet werden:
        <DataTemplate x:Key="ColorTemplate">

            <StackPanel Orientation="Horizontal">

                <Rectangle Width="40" Stroke="#FF000000">

                    <Rectangle.Fill>

                        [COLOR="Red"]<SolidColorBrush Color="{Binding}"/>[/COLOR]

                    </Rectangle.Fill>

                </Rectangle>

                <TextBlock Text =" " Foreground="Black" />

            </StackPanel>

        </DataTemplate>

(Anm. d. R.: Leerer TextBlock für Ein-Zeilen-Höhe)

Irgendwie mag WPF das aber nicht, im Output steht immer:

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:(no path); DataItem=null; target element is 'SolidColorBrush' (HashCode=273093); target property is 'Color' (type 'Color')

Programm stürzt nicht ab und es kommt der Fehler nur, wenn ich das Optionsfenster öffne. Frag mich auch, wie DataItem null sein soll.

Jemand ne Idee?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich nutze Ressourcen, das Template und die Liste sind als StaticResources im Usercontrol hinterlegt. (Will ja nicht 1000. Mal die Liste neu erstellen)

<ComboBox Grid.Row="0" Grid.Column="1" Margin="5"

                  ItemsSource="{Binding Mode=OneWay, Source={[COLOR="Red"]StaticResource[/COLOR] PropertyCollector}}" 

                  ItemTemplate="{[COLOR="Red"]StaticResource[/COLOR] ColorTemplate}" 

                  SelectedItem="{Binding BackgroundColorOption.Value}"/>

Dies entspricht, zumindest nach meiner Ansicht, FindResource() (nur halt XAML-Code). Zumindest mach ich das häufig so, aber der Fehler trat bisher komischerweise noch nie auf.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich nutze Ressourcen, das Template und die Liste sind als StaticResources im Usercontrol hinterlegt. (Will ja nicht 1000. Mal die Liste neu erstellen)

Ich meinte mit Resourcen ein ResourceDictionary (reine XAML-Datei), in der Dein jeweiliger Brush abgelegt wird und wenn ein Benutzer eine Auswahl trifft, wird eben diese Resource geladen.

Meine Überlegung: Warum sollte ich etwas schreiben, was es schon gibt?

Die Methode FindResource(), die das ResourceDictionary lädt, funktioniert (leider) nur Code-Behind.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich meinte mit Resourcen ein ResourceDictionary (reine XAML-Datei), in der Dein jeweiliger Brush abgelegt wird und wenn ein Benutzer eine Auswahl trifft, wird eben diese Resource geladen.

Weil die Objekte vom Typ Color sind und nicht vom Typ Brush. Und da ist es ja sinnvoller, wenn ich eh schon eine Aufzählung von Colors habe, den Brush dynamisch als Template zu erstellen (ist ja eh immer ein SCB). Bei einem ResourceDictionary müsste immer erst nachgesehen werden "Welche Farbe ist es? Aha. Nehme den Brush." (oder so)

Mir kam aber grad die Erleuchtung: Wenn WPF zu "dumm" ist, den Brush richtig zu erstellen, mach ichs halt selber.


        <local:ColorBrushConverter x:Key="BrushConverter"/>

        <DataTemplate x:Key="ColorTemplate">

            <StackPanel Orientation="Horizontal">

                <Rectangle Width="40" Fill="{Binding Converter={StaticResource BrushConverter}}" Stroke="#FF000000"/>

                <TextBlock Text =" " Foreground="Black" />

            </StackPanel>

        </DataTemplate>

    internal class ColorBrushConverter : IValueConverter

    {

        #region Constructors


        public ColorBrushConverter()

        {

        }


        #endregion


        #region Methods


        #region IValueConverter Members


        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

        {

            if (value is Color)

                return new SolidColorBrush((Color)value);

            else if (value is SolidColorBrush)

                return ((SolidColorBrush)value).Color;

            return null;

        }


        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

        {

            if (value is Color)

                new SolidColorBrush((Color)value);

            else if (value is SolidColorBrush)

                return ((SolidColorBrush)value).Color;

            return null;

        }


        #endregion


        #endregion

    }

Geht. :rolleyes:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...