DisplayAttribute doesn' t локализуют его свойства в модели

Я использую образец MVVM в своем заявлении WPF, и я применяю DisplayAttribute с локализацией к свойствам моей модели:

class MyModel
{
    [Display(
        ResourceType = typeof(Resources.Strings),
        Name = "MyPropertyName",
        Description = "MyPropertyDescription")]
    public double MyProperty { get; set; }
}

Я хочу показать локализованные свойства признака образцовой собственности. Необходимый файл ресурсов расположен в надлежащем месте, необходимая культура установлена. Я также установил Построить Действие как Вложенный Ресурс и Инструмент пользователя как PublicResXFileCodeGenerator - как требуется для DisplayAttribute. Но DisplayAttribute возвращает "MyPropertyName" вместо локализованной строки для его параметра Имени.

Сценарий, в котором я использую DisplayProperty, представлен ниже. Чтобы показать собственность признака образцовой собственности, я использую конвертер с классом помощника как это:

namespace MyProject.Converters
{
   //helper class
    public class MetadataParameters
    {
        public Type ModelType { get; set; }
        public string ModelProperty { get; set; }
        public Type AttributeType { get; set; }
        public string AttributeProperty { get; set; }
    }

    public class MetadataConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var mp = parameter as MetadataParameters;
            var modelPropertyInfo = mp.ModelType.GetProperty(mp.ModelProperty);
            var attribute = modelPropertyInfo
                .GetCustomAttributes(true)
                .Cast()
                .FirstOrDefault(memberInfo => memberInfo.GetType() == mp.AttributeType);
            var attributeProperty = attribute.GetType().GetProperty(mp.AttributeProperty);

            return attributeProperty.GetValue(attribute, null);
        }
    }
}

Ресурсы XAML:

xmlns:converters="clr-namespace:MyProject.Converters"

XAML:

xmlns:converters="clr-namespace:MyProject.Converters"
xmlns:DataAnnotations="clr-namespace:System.ComponentModel.DataAnnotations;assembly=System.ComponentModel.DataAnnotations"
xmlns:Models="clr-namespace:MyProject.Models"


        
            
                                            
            
        
    

Я пишу свой собственный простой признак, и он возвращает локализованную строку вместо просто ценности названия собственности (как DisplayAttribute делает):

public class LocalizedDisplayAttribute : Attribute
{
    private readonly string name;

    public virtual string Name
    {
        get
        {
            var rm = new System.Resources.ResourceManager(typeof(Resources.Strings));
            return rm.GetString(this.name);
        }
    }

    public LocalizedDisplayAttribute(string name)
        : base()
    {
        this.name = name;
    }
}


class MyModel
{
    [LocalizedDisplay("MyPropertyName")]
    public double MyProperty { get; set; }
}

Итак, почему DisplayAttribute не локализует свои свойства? MSDN заявляет, что этот признак был разработан для локализации. И в моем проекте ASP.NET MVC DisplayAttribute работает правильно.

1
nl ja de

1 ответы

Есть, Получают методы на DisplayAttribute и немногих других, что необходимо звонить, который даст вам локализованную строку, которую вы ищете. Что вы делаете, здесь должен получить ценность DisplayAttribute. Собственность имени, которая является "MyPropertyName".

Если вы называете DisplayAttribute. GetName (), это будет искать класс ресурса, как определено собственностью ResourceType, тогда это будет использовать собственность Имени отразить собственность на типе ресурса.

Я изменил ваш код учитывая, что там получит GetXXX() метод для AttributeProperty, который вы просите.

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
  var mp = parameter as MetadataParameters;
  var modelPropertyInfo = mp.ModelType.GetProperty(mp.ModelProperty);
  var attribute = modelPropertyInfo
      .GetCustomAttributes(true)
      .Cast()
      .FirstOrDefault(memberInfo => memberInfo.GetType() == mp.AttributeType);

 //We have to call the GetXXX methods on the attribute to get a localised result.
  //return ((DisplayAttribute)attribute).GetName();
  var result = attribute
    .GetType()
    .InvokeMember(
      "Get" + mp.AttributeProperty,
      BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public,
      null,
      attribute,
      new object[0]); 
  return result;
}
4
добавлено
Спасибо @base2 для указания на различие между.Name и.GetName. Теперь локализации используются.
добавлено автор juFo, источник
Я судил вас рецепт, и он работает! Спасибо. Я просто заменил hardcoded последовательность имени призванного участника к выражение для удобства.
добавлено автор user808128, источник
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot