2016-08-19 21 views
1

C#でプロパティに既定値を設定する方法を定義しようとしています。nullのときにプロパティの既定値を設定する

私は多くの要素TextBoxとデフォルト値を復元するためのボタンがあります。ユーザーがボタンをクリックすると、TextBoxのコンテンツがデフォルトに設定されます。

私の考えは、値をnullに設定し、setterで値をチェックし、値がnullの場合はdefaultを設定することです。

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

しかしdefault(ExamplePropertie)ではありません。私はこのような何かをやってみたかった

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

各バインドさ要素の場合:テキストボックスの

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; 
      } 
     } 
    } 
} 

例:

は私のコードがありますそれを行う良い方法。 [DefaultValue(value)]で定義された値を設定するにはどうすればよいですか?

+0

プロパティの横に 'const'値を導入し、属性とセッターのコードの両方に使用する必要があります。 –

+0

コードがバインディングを使用していないため、値をテキストボックスに直接割り当てています。データバインドとは、コントロールにデータの検索場所を指示することを意味します。どのようなアプリケーションを構築していますか?例えばWPFでは、バインディング式のデフォルト値を指定することができます –

+0

コード 'default(ExamplePropertie)'は、 'type'のデフォルト値を取得します。 'DefaultValue'属性はそれとは無関係です。 – Baldrick

答えて

1

[DefaultValue(...)]は属性です。あなたのプロパティの名前にdefault(...)を適用することによってその価値を得ることはできません。プロセスはより複雑です:PropertyInfoオブジェクトをあなたのプロパティ用に取得し、タイプDefaultValueAttributeのカスタム属性をクエリし、その値だけを取得する必要があります。

は、プロセスは、ヘルパーメソッドとはるかに簡単になります:

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; 
} 

別のクラスには、このヘルパーメソッドを入れて、次のようにそれを使用する:

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

注:foreachループでSetDefaultは次のように簡略化できます。

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

'obj.GetProperty(propertyName)'はコンパイルされませんが、 'obj.GetType()。GetProperty(propertyName)'はうまくいきます!私は 'OfType'のヒントをありがとう! –

2

さて、あなたはその属性の値を取得するためにリフレクションに頼ることができますが、簡単な方法は、単にの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

その場合、[DefaultValue()]は役に立たないですね。 –

+1

なぜそれを言うのですか? DefaultValueAttributeは何をしていますか?シリアライザのようなものでは、デフォルト値のプロパティを省略して出力を最適化するために使用されます。シリアライザが省略するのが安全であることを知る方法は、プロパティがDefaultValueAttributeで指定されたものと同じ値を持つことです。だから、無駄ではない。あなたの場合は不必要かもしれませんが、あなただけがそれを知ることができます。 –

+0

OK、私はそれをすべて知っていませんでした。私はそれを保つつもりです。ご説明をいただき、ありがとうございます。 –

関連する問題