Page 1 of 1

Noesis cannot set property of converter from resource

Posted: 18 Jun 2020, 21:55
by ck_russ
EDIT: See post #3 for a more accurate description of the problem. It has nothing to do with resource dictionaries.

---------

I have a converter which has some properties. In a resource dictionary, I attempt to set some of these properties during the setup of the converter. This fails with a:
"[NOESIS/E] ResourceDictionary.xaml(6): StaticResource 'SomeColor' not found." error.

I've created a minimal example below. The extra Brushes.SomeBrush item in the resource dictionary is just to illustrate that the thing I'm trying to reference (StaticResource SomeColor) is indeed properly initialized and functioning. I only get the error when trying to apply it to the converter's property. This works in WPF.

Resource Dictionary:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:Tests">

    <Color x:Key="SomeColor">#ff00ff00</Color>
    <SolidColorBrush x:Key="Brushes.SomeBrush" Color="{StaticResource SomeColor}"/>
    <local:ReturnColorConverter x:Key="Converters.ReturnColorConverter" SomeColorProperty="{StaticResource SomeColor}"/>

</ResourceDictionary>
Converter:
    class ReturnColorConverter : IValueConverter
    {
        public Color SomeColorProperty { get; set; } = Colors.Red;

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return SomeColorProperty;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return null;
        }
    }
MainWindow:
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="ResourceDictionary.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
    
    <Grid>
        <Rectangle>
            <Rectangle.Fill>
                <SolidColorBrush Color="{Binding Converter={StaticResource Converters.ReturnColorConverter}}"/>
            </Rectangle.Fill>
        </Rectangle>
    </Grid>
    

Re: Noesis cannot set property of converter inside a resource dictionary

Posted: 19 Jun 2020, 07:05
by ck_russ
To clarify one thing, this is only for setting the property to another value within that resource dictionary. Everything works fine setting the property to a constant. So it's just that for some reason Noesis does not seem to be seeing the initialized value of the static resource in this context.

Re: Noesis cannot set property of converter inside a resource dictionary

Posted: 19 Jun 2020, 10:09
by ck_russ
I narrowed this down. The exact issue is simply setting a Converter property using a static resource. Here is a more succinct example where I do not use a resource dictionary at all. Instead all resources are defined in the main window. I create a resource (a brush) which is set to green. I then draw three rectangles. The first rectangle is using the resource directly without a converter. It should draw green. The second rectangle uses the converter without setting its brush property. It should draw red, the default value given inside the converter. The last rectangle is drawn after setting the converter's property to the static resource, so it should draw green.

In WPF I get Green-Red-Green
In Noesis I get Green-Red-[null]

I'd expect that since Noesis fails to find the resource I am trying to set the converter's property, it ends up not creating the converter. And so the final square when drawn with noesis ends up null.

Main Window
    <Window.Resources>
        <ResourceDictionary>
            <SolidColorBrush x:Key="LocalBrush" Color="Green"/>
            <local:ReturnColorConverter x:Key="Converters.ReturnColorConverterWithoutPropertySet"/>
            <local:ReturnColorConverter x:Key="Converters.ReturnColorConverterWithPropertySet" SomeBrushProperty="{StaticResource LocalBrush}"/>
        </ResourceDictionary>
    </Window.Resources>

    <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
        <Rectangle Width="25" Height="25" Fill="{StaticResource LocalBrush}"/>
        <Rectangle Width="50" Height="10" Fill="Blue"/>
        <Rectangle Width="25" Height="25" Fill="{Binding Converter={StaticResource Converters.ReturnColorConverterWithoutPropertySet}}"/>
        <Rectangle Width="50" Height="10" Fill="Blue"/>
        <Rectangle Width="25" Height="25" Fill="{Binding Converter={StaticResource Converters.ReturnColorConverterWithPropertySet}}"/>
    </StackPanel>
    
Converter
    class ReturnColorConverter : IValueConverter
    {
        public Brush SomeBrushProperty { get; set; } = Brushes.Red;

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return SomeBrushProperty;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return null;
        }
    }

Re: Noesis cannot set property of converter from resource

Posted: 19 Jun 2020, 16:39
by sfernandez
Hi, I was able to reproduce the problem, can you please report it in our bugtracker an we will fix it for the next release?

Re: Noesis cannot set property of converter from resource

Posted: 19 Jun 2020, 21:31
by ck_russ
Sure thing. Reported here: #1729

Re: Noesis cannot set property of converter from resource

Posted: 22 Jun 2020, 11:08
by sfernandez
Thanks for the report, we fxed it for the next release.

Re: Noesis cannot set property of converter from resource

Posted: 25 Jun 2020, 07:02
by ck_russ
Thanks, much appreciated!