В UWP, что эквивалентно свойству DependencyType класса DependencyProperty WPF?

#c# #wpf #uwp #dependency-properties

#c# #wpf #uwp #свойства зависимости

Вопрос:

После переноса библиотеки классов WPF в библиотеку классов UWP следующий код выдает ошибку. Свойство PropertyType класса DependencyProperty работало в WPF. Я пытался получить помощь из Обзора свойств зависимостей аналогичного класса в UWP и этой онлайн-статьи, но немного запутался.

Чего мне здесь не хватает и как я могу заставить это работать?

Фрагмент кода [ошибка возникает в первой строке метода]:

 using Windows.UI.Xaml;
using System.Reflection;
using Windows.UI.Xaml.Documents;
using System.ComponentModel;
....

private static void SetPropertyValue(XmlElement xamlElement, DependencyProperty property, string stringValue)
{
    TypeConverter typeConverter TypeDescriptor.GetConverter(property.PropertyType);
    try
    {
        object convertedValue = typeConverter.ConvertFromInvariantString(stringValue);

        if (convertedValue != null)
        {
            xamlElement.SetAttribute(property.Name, stringValue);
        }
    }
    catch(Exception)
    {
    }
}
  

Ошибка:

‘DependencyProperty’ не содержит определения для ‘PropertyType’, и не удалось найти доступного метода расширения ‘PropertyType’, принимающего первый аргумент типа ‘DependencyProperty’ (вам не хватает директивы using или ссылки на сборку?)

Снимок «ВСЕХ» установленных пакетов:

введите описание изображения здесь

Комментарии:

1. Короче говоря, система. Windows. DependencyProperty не поддерживается в UWP или .NetStandrad 2.0. Поэтому вам нужно найти другие способы установки значения свойства в UWP.

Ответ №1:

Ниже приведен простой пример того, как вы можете использовать DependencyProperty в UWP .

XAML

 <Page x:Name="loginPage"
... >

<TextBlock Text="{Binding welcomeText,ElementName=loginPage}"></TextBlock>
  

C#

 using Windows.UI.Xaml;
...
public string welcomeText
{
     get { return (string)GetValue(welcomeTextProperty); }
     set { SetValue(welcomeTextProperty, value); }
}

// Using a DependencyProperty as the backing store for welcomeText.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty welcomeTextProperty =
        DependencyProperty.Register("welcomeText", typeof(string), typeof(LoginPage), null);
  

В приведенном выше примере мы привязываем свойство dependency, welcomeText которое мы определяем в коде, лежащем в основе (C #) , к a TextBlock .

Пожалуйста, обратите внимание, ElementName=loginPage это имя страницы, которое мы определяем в XAML.

Надеюсь, это поможет.


РЕДАКТИРОВАТЬ 1:

Насколько я могу понять из вашего кода, вы пытаетесь получить PropertyType значение, чтобы преобразовать его в другой тип.

Для этого требования вы можете сделать что-то вроде этого:

В следующем примере у нас есть пользовательский преобразователь значений, который преобразует длину строки в Visibility , другими словами, возвращает Visibility на основе длины строки, которую он получает для преобразования, а также проверяет, соответствует ли value предоставленный тип типу string .

XAML

 <Page x:Name="loginPage"
 xmlns:converters="using:projectName.converters"
... >
<Page.Resources>
    <converters:LengthToVisibilityConverter x:Key="lengthToVisibilityKey"></converters:LengthToVisibilityConverter>
</Page.Resources>
...
<TextBlock x:Name="flyoutTxt" Text="{Binding welcomeText,ElementName=loginPage}"></TextBlock>
<TextBlock Text="Has some text" Visibility="{Binding Path=Text,ElementName=flyoutTxt,Converter={StaticResource lengthToVisibilityKey}}"></TextBlock>
  

Здесь видимость второго TextBlock основана на длине текста flyoutTxt .

C#

Пользовательский класс конвертера для преобразования длины в видимость :

 class LengthToVisibilityConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {   //checking if type of "value" is String and its length
        if(value != null amp;amp; value.GetType() == typeof(string) amp;amp; 
           value.ToString().Length > 0)
        {
            return Visibility.Visible;
        }
        else
        {
            return Visibility.Collapsed;
        }

    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}
  

Пожалуйста, обратите внимание, что в зависимости от свойства, определенной выше, не требуется никаких изменений.

Комментарии:

1. Итак, как нам программно получить PropertyType значение DependenceProperty welcomeText из вашего приведенного выше примера? Помните, ошибка в моем коде находится в следующей строке моего кода, в которой жалуется, что ‘DependencyProperty’ не содержит определения для ‘PropertyType’: TypeConverter typeConverter TypeDescriptor.GetConverter(property.PropertyType);

2. Вероятно, мне следует перефразировать сообщение. Вопрос в том, что у DependenceProperty класса в WPF есть свойство, которое называется PropertyType . Но DependenceProperty класс в UWP не обладает таким свойством. Итак, как нам справиться с этой ситуацией программно? Например, если у класса Person в WPF есть свойство, LastName вы можете получить к нему доступ через Person prs = new Person(), prs.LastName . Но у Person класса в UWP нет свойства LastName . Итак, когда мы преобразуем WPF библиотеку классов в UWP library, как мы обрабатываем LastName свойство класса Person в UWP ?

3. Хорошо .. теперь я понял, я неправильно понял вопрос.. Я не уверен, сможете ли вы заменить, PropertyType поскольку DependencyProperty в UWP оно из Windows.Ui.xaml, где, как и в WPF, оно из другого пространства имен.