none
Resourcenzugriff auf Hilfsklasse RRS feed

  • Frage

  • Hallo!

    Ich habe eine Hilfsklasse, in der ich eine Aufzählung deklariert habe:

    namespace myNS
    {
        public class myClass
        {
            public enum myEnum { Alpha, Funktion};               
    
    

    Nun möchte ich in einem ResourceDictionary eine Ressource dieser Hilfsklassen-Aufzählung definieren:

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:myNS="clr-namespace:myNS"
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    


    <myNS:myClass.myEnum x:Key="MyEnum">Alpha</myNS:myClass.myEnum>
    

    VS erkennt aber in meinem Namespace die Hilfsklasse nicht (und kann damit auch auf die Aufzählung nicht zugreifen).

    Warum das denn???

    Dienstag, 2. Mai 2017 15:42

Antworten

  • Hallo perlfred,

    so sollte es gehen:

    MyEnum.cs

    namespace WpfApplication8
    {
        public enum MyEnum { Alpha, Function }
    }
    

    MainWindow.xaml

    <Window x:Class="WpfApplication8.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:sys="clr-namespace:System;assembly=mscorlib"
            xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
            xmlns:local="clr-namespace:WpfApplication8"
            mc:Ignorable="d"
            Title="MainWindow" Height="150" Width="200">
        <Window.Resources>
            <ObjectDataProvider x:Key="myEnumData" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
                <ObjectDataProvider.MethodParameters>
                    <x:Type TypeName="local:MyEnum"/>
                </ObjectDataProvider.MethodParameters>
            </ObjectDataProvider>
            <CollectionViewSource x:Key="myEnumDataSorted" Source="{StaticResource myEnumData}">
                <CollectionViewSource.SortDescriptions>
                    <scm:SortDescription Direction="Descending"/>
                </CollectionViewSource.SortDescriptions>
            </CollectionViewSource>
            <local:MyEnum x:Key="myEnum">Alpha</local:MyEnum>
        </Window.Resources>
        <DockPanel VerticalAlignment="Center" LastChildFill="False">
            <TextBox Margin="5" Width="100" DockPanel.Dock="Top"
                     Text="{Binding Source={StaticResource myEnum}, Mode=OneWay}"/>
            <ComboBox Name="myEnumComboBox" Margin="5" Width="100" DockPanel.Dock="Top"
                      ItemsSource="{Binding Source={StaticResource myEnumData}}"/>
            <ComboBox Name="myEnumComboBoxSorted" Margin="5" Width="100" DockPanel.Dock="Top"
                      ItemsSource="{Binding Source={StaticResource myEnumDataSorted}}"/>
            <TextBlock Margin="5" Width="100" DockPanel.Dock="Top" Foreground="Green"
                       Text="{Binding ElementName=myEnumComboBox, Path=SelectedItem}"/>
        </DockPanel>
    </Window>

    Du siehst beide Zugriffe auf die Enum. Zum einen den Zugriff auf einen spezifischen Wert und zum anderen den Zugriff auf alle Werte (nativ und sortiert)

    Viel Erfolg
    Rolf


    Dienstag, 13. Juni 2017 06:12

Alle Antworten

  • Hallo!

    Nach einem erneutem kompilieren wird vom VS zwar die Hilfsklasse erkannt, aber auf die (public) Aufzählung kann ich dennoch so nicht zugreifen:

    Fehler	Geschachtelte Eigenschaften werden nicht unterstützt: myClass.myEnum. 

    Ist das schon ein Nested Type ?

    "Testprojekt":

    using System.Windows;
    
    namespace myNS
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                var myEnum = myClass.myEnum.Alpha;  // Geht doch :-)
            }
        }
        public class myClass { public enum myEnum { Alpha, Funktion }; }
    }
    <Window x:Class="myNS.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:myNS="clr-namespace:myNS"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <myNS:myClass.myEnum x:Key="myEnum_Alpha">Alpha</myNS:myClass.myEnum>
        </Window.Resources>
    </Window>

    Mittwoch, 3. Mai 2017 07:55
  • Hallo perlfred,

    so sollte es gehen:

    MyEnum.cs

    namespace WpfApplication8
    {
        public enum MyEnum { Alpha, Function }
    }
    

    MainWindow.xaml

    <Window x:Class="WpfApplication8.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:sys="clr-namespace:System;assembly=mscorlib"
            xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
            xmlns:local="clr-namespace:WpfApplication8"
            mc:Ignorable="d"
            Title="MainWindow" Height="150" Width="200">
        <Window.Resources>
            <ObjectDataProvider x:Key="myEnumData" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
                <ObjectDataProvider.MethodParameters>
                    <x:Type TypeName="local:MyEnum"/>
                </ObjectDataProvider.MethodParameters>
            </ObjectDataProvider>
            <CollectionViewSource x:Key="myEnumDataSorted" Source="{StaticResource myEnumData}">
                <CollectionViewSource.SortDescriptions>
                    <scm:SortDescription Direction="Descending"/>
                </CollectionViewSource.SortDescriptions>
            </CollectionViewSource>
            <local:MyEnum x:Key="myEnum">Alpha</local:MyEnum>
        </Window.Resources>
        <DockPanel VerticalAlignment="Center" LastChildFill="False">
            <TextBox Margin="5" Width="100" DockPanel.Dock="Top"
                     Text="{Binding Source={StaticResource myEnum}, Mode=OneWay}"/>
            <ComboBox Name="myEnumComboBox" Margin="5" Width="100" DockPanel.Dock="Top"
                      ItemsSource="{Binding Source={StaticResource myEnumData}}"/>
            <ComboBox Name="myEnumComboBoxSorted" Margin="5" Width="100" DockPanel.Dock="Top"
                      ItemsSource="{Binding Source={StaticResource myEnumDataSorted}}"/>
            <TextBlock Margin="5" Width="100" DockPanel.Dock="Top" Foreground="Green"
                       Text="{Binding ElementName=myEnumComboBox, Path=SelectedItem}"/>
        </DockPanel>
    </Window>

    Du siehst beide Zugriffe auf die Enum. Zum einen den Zugriff auf einen spezifischen Wert und zum anderen den Zugriff auf alle Werte (nativ und sortiert)

    Viel Erfolg
    Rolf


    Dienstag, 13. Juni 2017 06:12
  • Hallo Rolf!

    Die Aufzählung in eine "Datenquelle" umzuformen um dann darauf zugreifen zu können ... darauf muss man erst einmal kommen! :-).

    Danke für deine Lösung! (Ich hatte schon gar nicht mehr damit gerechnet ;-) )

    Fred.

    Dienstag, 13. Juni 2017 14:03