在UWP中,WPF的DependencyProperty类的DependencyType属性等效于什么?

时间:2019-03-31 02:04:31

标签: c# wpf uwp dependency-properties

将WPF类库迁移到UWP类库后,以下代码将引发错误。 PropertyTypeDependencyProperty class属性在WPF中起作用。我试图从UWP的Dependency properties overview类的similar和在线this的网站上获得帮助,但有些困惑。

我在这里缺少什么,如何使它工作?

代码段[在方法的第一行发生错误]:

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指令或程序集引用?)

已安装所有软件包的快照:

enter image description here

1 个答案:

答案 0 :(得分:0)

以下是如何在UWP中使用DependencyProperty的简单示例。

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

在上面的示例中,我们将在(C#)后面的代码中定义的依赖项属性welcomeText绑定到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#

用于将Length转换为Visibility的自定义Converter类:

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 && value.GetType() == typeof(string) && 
           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();
    }
}

请注意,上面定义的属性依赖项不需要任何更改。