Laden...

Enum [flag] übergeben xaml

Erstellt von Robin0 vor 10 Jahren Letzter Beitrag vor 10 Jahren 4.068 Views
R
Robin0 Themenstarter:in
212 Beiträge seit 2012
vor 10 Jahren
Enum [flag] übergeben xaml

Hallo,

Gibt es eine möglichkeit bei dem folgenden fall:
Beide enumerationen zu übergeben im XAML??


public static class Behavior
{
        public static readonly DependencyProperty ActiveToolsProperty = DependencyProperty.RegisterAttached(
          "ActiveTools",
          typeof(Tools),
          typeof(DataGridItemBehavior)
        );

        public static void SetActiveTools(UIElement element, Visibility value)
        {
            element.SetValue(ActiveToolsProperty, value);
        }
        public static Tools GetActiveTools(UIElement element)
        {
            return (Tools)element.GetValue(ActiveToolsProperty);
        }

}
    [Flags]
    public enum Tools : int
    {
        ExcelExport = 1,
        ColumnVisibility = 2
    }


<!-- Hier die übergabe -->
<DataGrid attached:Behavior.ActiveTools="ColumnVisibility,ExcelExport" />

5.657 Beiträge seit 2006
vor 10 Jahren

Hi Robin0,

fehlt da nicht das ActiveTools-Property (das eigentliche Property, nicht das DependencyProperty)? Wo hast du das denn deklariert?

Christian

Weeks of programming can save you hours of planning

R
Robin0 Themenstarter:in
212 Beiträge seit 2012
vor 10 Jahren

Nein, bei Attached-properties wird das nicht benötigt "DependencyProperty.RegisterAttached"

Dafür ist Get... und Set... da.

5.657 Beiträge seit 2006
vor 10 Jahren

Stimmt das hatte ich übersehen. Dann sollten die Enum-Werte auch über die Enum.Parse-Methode umgewandelt werden können. Hast du denn eine Fehlermeldung? Gibt es Databinding-Fehler im Ausgabefenster?

Weeks of programming can save you hours of planning

R
Robin0 Themenstarter:in
212 Beiträge seit 2012
vor 10 Jahren

Nein ich bekomm einfch immer nur eine 0 wenn ich versuche mehrere Enums zu übergeben

5.657 Beiträge seit 2006
vor 10 Jahren

Eine 0 ist aber ein komischer Wert für ein Enum, bei einem Parsing-Problem sollte doch der Default-Wert zurückgeliefert werden. Liegt aber sicherlich daran, daß deine Set-Methode eine Enum vom Typ Visibility erwartet, aber das Property vom Typ Tools ist. Deswegen wird Enum.Parse für die Visibility-Enum aber nicht für die Tools-Enum aufgerufen.

Christian

Weeks of programming can save you hours of planning

709 Beiträge seit 2008
vor 10 Jahren

Hi Robin0,
mit einem + statt eines Kommas sollte es gehen.

Gruß
pinki

5.657 Beiträge seit 2006
vor 10 Jahren

mit einem + statt eines Kommas sollte es gehen.

Komma ist schon richtig, siehe Ausführliche Erläuterung der XAML-Syntax im Abschnitt Enumerationsattributwerte:

Sie können mehrere Werte für eine Flag-Enumeration angeben, indem Sie die einzelnen Werte durch Kommas trennen.

Christian

Weeks of programming can save you hours of planning

R
Robin0 Themenstarter:in
212 Beiträge seit 2012
vor 10 Jahren

@pinki & MrSparkle
das ,(Komma) dazwischen Funktioniert tatsächlich 😃.

Leider wenn ich es über die attacht property einem Converter übergebe nichtmehr.

Converter:



 class EnumFlagToVisibilityConverter: IValueConverter
    {

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {                    
                if (value != null 
                && parameter != null 
                && value.GetType().BaseType == typeof(System.Enum) )
            {

                Enum activeTools = (Enum)value;
                Enum proveTool;

                //Wert ist immer 0 bei (Komma)//int TEst = System.Convert.ToInt32(activeTools);

                try
                {
                    proveTool = (Enum)Enum.Parse(typeof(Enum), parameter as String);
                }
                catch { return Visibility.Collapsed; }

                if(activeTools.HasFlag(proveTool))
                {
                    return Visibility.Visible;
                }
            }

            return Visibility.Collapsed;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }

709 Beiträge seit 2008
vor 10 Jahren

@MrSparkle:
Hmmm... Das finde ich seltsam.

Wenn ich

<KeyBinding Command="{Binding SaveProjectAsCommand}" Key="S" Modifiers="Control,Shift"/>

schreibe, dann bekomme ich eine XamlParseException.

Wenn ich jedoch

<KeyBinding Command="{Binding SaveProjectAsCommand}" Key="S" Modifiers="Control+Shift"/>

schreibe, dann nicht.

Deshalb dachte ich immer, dass dort ein + hingehört.

Gruß
pinki

5.657 Beiträge seit 2006
vor 10 Jahren

Hi Robin0,

Leider wenn ich es über die attacht property einem Converter übergebe nichtmehr.

Dadurch überschreibst du den Standard-Converter, der den Text aus der XAML-Datei in eine Enum konvertiert. Dann mußt du den Text selbst parsen. Dein Converter würde also den Text übergeben bekommen, und den mußt du dann mit Enum.Parse umwandeln. Mit dem Debugger müßtest du relativ schnell nachvollziehen können, was da abläuft.

Hi pinki,

Die ModifierKeys-Enumeration hat ein TypeConverterAttribute mit einem eigenen Converter vom Typ ModifierKeysConverter. Also wird nicht der normale Enum-Converter verwendet. Das ist sicherlich in diesem speziellen Fall so gelöst, damit die Darstellung im XAML genauso aussieht, wie nacher z.B. im Menü ("Ctrl+C").

Christian

Weeks of programming can save you hours of planning

709 Beiträge seit 2008
vor 10 Jahren

Immer diese Sonderfälle...
Wie soll man denn da noch den Überblick behalten? X(

5.657 Beiträge seit 2006
vor 10 Jahren

Wie soll man denn da noch den Überblick behalten?

Dafür eignet sich doch die Doku ganz gut.

Weeks of programming can save you hours of planning

R
Robin0 Themenstarter:in
212 Beiträge seit 2012
vor 10 Jahren

So zusammenfassend,

Kommas funktioneiren zur Trennung von Enums in XAML. (Auch mit Converter)
(Bis auf ein paar wenige sonderfälle)