0
votes

After migrating a WPF class library to a UWP class library, the following code is throwing an error. The PropertyType property of DependencyProperty class worked in WPF. I tried to get help from Dependency properties overview of similar class in UWP and this online article but got a bit confused.

What I'm missing here and how can I make it work?

Code snippet [error occurs at first line of the method]:

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)
    {
    }
}

Error:

'DependencyProperty' does not contain a definition for 'PropertyType' and no accessible extension method 'PropertyType' accepting a first argument of type 'DependencyProperty' could be found (are you missing a using directive or an assembly reference?)

Snapshot of "ALL" the packages installed:

enter image description here

1
In short, the System.Windows.DependencyProperty is not supported in UWP or .NetStandrad 2.0. So, you need to find other ways to set property value in UWP.Bite

1 Answers

0
votes

Following is a simple example of how you can use DependencyProperty in 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);

In the above example we are binding the dependency property welcomeText which we define in the code behind (C#) to a TextBlock.

Please note, ElementName=loginPage is the page name that we define in the XAML.

Hope this helps.


EDIT 1:

From what I can understand from your code you are trying to get the PropertyType value in order to convert it to a different type.

For this requirement you can do something like this:

In the following example we have a custom value converter which converts Length of a string to Visibility, in other words, return Visibility based on the length of string it receives for conversion, while also checking if the type of value provided is of the type 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>

Here, the second TextBlock's visibility is based on the length of text of flyoutTxt.

C#

Custom Converter class to convert Length to Visibility :

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

Please note, there are no changes required in the property dependency defined above.