2016-08-19 3 views
1

Ich versuche, eine Möglichkeit zum Festlegen von Standardwert für meine Eigenschaften in C# zu definieren.Legen Sie den Standardwert für Eigenschaften fest, wenn Null

Ich habe viele Elemente TextBox und eine Schaltfläche, um den Standardwert wiederherzustellen. Ich möchte, dass, wenn Benutzer auf die Schaltfläche klicken, der Inhalt für TextBox auf Standard festgelegt ist.

Meine Idee ist es, den Wert auf Null und in Setter, überprüfen Sie Wert und wenn Wert ist Null, setzen Sie den Standardwert.

Es ist mein Code:

private void SetDefault() 
{ 
    Grid actualItem = tabControl.SelectedContent as Grid; 
    if (actualItem != null) 
    { 
     foreach (object elt in actualItem.Children) 
     { 
      if (elt.GetType() == typeof(TextBox)) 
      { 
       TextBox box = elt as TextBox; 
       box.Text = null; 
      } 
     } 
    } 
} 

Beispiel TextBox:

<TextBox Grid.Row="1" Grid.Column="1" 
     Style="{StaticResource TextBoxStyle}" 
     Text="{Binding ExamplePropertie, 
       Mode=TwoWay, 
       UpdateSourceTrigger=PropertyChanged}"/> 

Für jedes binded Element, das ich so etwas wie dies tun wollte:

[DefaultValue("default")] 
public String ExamplePropertie 
{ 
    get 
    { 
     return _myProp; 
    } 
    set 
    { 
     if (value == null) 
      default(ExamplePropertie); // Not working 
     else 
      _myProp = value; 
     OnPropertyChanged(nameof(ExamplePropertie)); 
    } 
} 

Aber default(ExamplePropertie) nicht ist der gute Weg, das zu tun. Wie kann ich den mit [DefaultValue(value)] definierten Wert einstellen?

+0

Sie sollten einen "const" -Wert neben Ihrer Eigenschaft einfügen und sowohl im Attribut als auch im Code des Setter verwenden. –

+0

Ihr Code verwendet keine Bindung, Sie weisen Textfeldern direkt Werte zu. Datenbindung bedeutet, dass Sie dem Steuerelement mitteilen, wo die Daten zu finden sind. Welche Art von Anwendung bauen Sie? ZB in WPF können Sie einen Standardwert im Binding-Ausdruck angeben –

+0

Der Code 'default (ExamplePropertie)' erhält nur den Standardwert dieses 'types', der für jeden Referenztyp immer' null' ist. Das 'DefaultValue' Attribut ist damit nicht verwandt. – Baldrick

Antwort

1

[DefaultValue(...)] ein Attribut ist. Sie können den Wert nicht erhalten, indem Sie default(...) auf den Namen Ihrer Immobilie anwenden. Der Prozess ist komplizierter: Sie müssen PropertyInfo Objekt für Ihre Eigenschaft abrufen, es für ein benutzerdefiniertes Attribut vom Typ DefaultValueAttribute abfragen und nur dann den Wert daraus abholen.

Der Prozess geht viel leichter mit einem Helfer-Methode:

static T GetDefaultValue<T>(object obj, string propertyName) { 
    if (obj == null) return default(T); 
    var prop = obj.GetType().GetProperty(propertyName); 
    if (prop == null) return default(T); 
    var attr = prop.GetCustomAttributes(typeof(DefaultValueAttribute), true); 
    if (attr.Length != 1) return default(T); 
    return (T)((DefaultValueAttribute)attr[0]).Value; 
} 

diese Hilfsmethode in eine separate Klasse Put und es verwenden, wie folgt:

_myProp = value ?? Helper.GetDefaultValue<string>(this, nameof(ExampleProperty)); 

Hinweis:foreach Schleife in SetDefault kann wie folgt vereinfacht werden:

foreach (object box in actualItem.Children.OfType<TextBox>()) { 
    box.Text = null; 
} 
+0

'obj.GetProperty (propertyName)' kompiliert nicht, aber mit 'obj.GetType(). GetProperty (propertyName)' es funktioniert gut! Ich kannte 'OfType' nicht, danke für die Tipps! –

2

Nun können Sie zum Nachdenken greifen den Wert dieses Attributs zu erhalten, sondern ein einfacher Weg wäre, einfach den Standard speichern Wert als const:

private const string ExamplePropertieDefault = "default"; 

[DefaultValue(ExamplePropertieDefault)] 
public String ExamplePropertie 
{ 
    get 
    { 
     return _myProp; 
    } 
    set 
    { 
     if (value == null) 
      ExamplePropertieDefault; 
     else 
      _myProp = value; 
     OnPropertyChanged(nameof(ExamplePropertie)); 
    } 
} 
+2

In diesem Fall ist [DefaultValue()] nutzlos, oder? –

+1

Warum würden Sie das sagen? Weißt du was DefaultValueAttribute tut? Es wird von Dingen wie Serialisierern verwendet, um die Ausgabe zu optimieren, indem Eigenschaften mit ihrem Standardwert weggelassen werden. Die Art und Weise, in der ein Serializer weiß, dass es sicher wegzulassen ist, hat den gleichen Wert wie die im DefaultValueAttribute angegebene Eigenschaft. Also nein, es ist nicht nutzlos. Es kann in Ihrem Fall unnötig sein, aber nur Sie können das wissen. –

+0

OK, ich wusste das alles nicht. Ich werde es dann behalten. Ich danke Ihnen für Ihre Erklärung. –

Verwandte Themen