10

クラスがあります

public class Car 
{
    [Description("name of the car")]
    public string Name { get; set; }

    [Description("age of the car")]
    public int Age { get; set; }
}

Description属性をLabelコンテンツにバインドする可能性はありますか?私が探しているソリューションは、Carオブジェクトをインスタンス化する必要はありません。

4

5 に答える 5

10

これは適切なバインディングではありませんが(静的データには必要ありません)MarkupExtension、タイプとプロパティ名を渡してリフレクションを介して取得するだけで、簡単に作成して取得できます。

アウトラインは次のようになります。

public Type Type { get; set; }
public string PropertyName { get; set; }

ProvideValue: Type.GetProperty(PropertyName)
                  .GetCustomAttributes(true)
                  .OfType<DescriptionAttribute>()
                  .First()
                  .Description
<!-- Usage example -->
Text="{me:Description Type=local:Car, PropertyName=Name}"
于 2012-09-19T10:31:54.003 に答える
1

プロパティのメタデータであるため、できません。カスタムバインディングクラスを作成することで回避できます。

于 2012-09-19T10:30:07.113 に答える
1

1あなたはConverter

public sealed class PropertyDescriptionConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value == null)
                return Binding.DoNothing;

            string propertyName = parameter as string;
            if (String.IsNullOrEmpty(propertyName))
                return new ArgumentNullException("parameter").ToString();

            Type type = value.GetType();

            PropertyInfo property = type.GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance);
            if (property == null)
                return new ArgumentOutOfRangeException("parameter", parameter,
                    "Property \"" + propertyName + "\" not found in type \"" + type.Name + "\".").ToString();

            if (!property.IsDefined(typeof(DescriptionAttribute), true))
                return new ArgumentOutOfRangeException("parameter", parameter,
                    "Property \"" + propertyName + "\" of type \"" + type.Name + "\"" +
                    " has no associated Description attribute.").ToString();

            return ((DescriptionAttribute)property.GetCustomAttributes(typeof(DescriptionAttribute), true)[0]).Description;
        }

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

2リソースを挿入します

    <Window.Resources>
        <local:PropertyDescriptionConverter x:Key="PropertyDescriptionConverter" />
    </Window.Resources>

3このバインディングを追加します

"{Binding ConverterParameter=Name, Converter={StaticResource PropertyDescriptionConverter}}"
于 2012-09-19T10:32:44.503 に答える
1

文字列リテラルの代わりに、文字列定数を使用して属性パラメータを設定します。

public class Car
{
    public const string CarNamePropertyDescription = "name of the car";
    
    [Description(CarNamePropertyDescription)]
    public string Name { get; set; }
}

定数は、拡張機能を介してxamlからアクセスできます{x:Static}(属性は実行時に変更されないため、バインディングは必要ありません)。

<Label Content="{x:Static namespace:Car.CarNamePropertyDescription}"/>
于 2021-03-17T08:50:04.630 に答える
0

次に、クラスの属性を読み取り、リーダークラスの属性をバインドするリーダークラスを作成します。例えば

public class Reader
{
   public Dictionary<string, string> Description {get; set;}
}

于 2012-09-19T10:33:16.270 に答える