wpfxamlmvvmmvvm-lightmvvm-toolkit

Provide value on 'System.Windows.StaticResourceExtension' threw an exception


I am trying to bind Visibility of Window in WPF by Converter. I am getting the error. System.Windows.StaticResourceExtension System.Windows.StaticResourceExtension

I am providing my code below. My View is enter image description here

<Window x:Class="UI.ChildWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:UI"
    xmlns:UtilityValue="clr-namespace:UI.Utility"
    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"        
    mc:Ignorable="d"
    Title="ChildWindow" Height="70" Width="400" WindowStartupLocation="CenterScreen" WindowStyle="None" 
    Visibility="{Binding WindowVisibility, Converter={StaticResource VisibilityConverter}, Mode=TwoWay}">    
<Window.Resources>
    <UtilityValue:TextInputToVisibilityConverter x:Key="TextInputToVisibilityConverter"></UtilityValue:TextInputToVisibilityConverter>
    <UtilityValue:EventToCommandBehavior x:Key="CommandBehavior"></UtilityValue:EventToCommandBehavior>
    <SolidColorBrush x:Key="brushWatermarkBackground" Color="White" />
    <SolidColorBrush x:Key="brushWatermarkForeground" Color="LightSteelBlue" />
    <SolidColorBrush x:Key="brushWatermarkBorder" Color="Indigo" />
    <UtilityValue:BooleanToVisibilityConverter x:Key="VisibilityConverter"></UtilityValue:BooleanToVisibilityConverter>      
    <Style x:Key="EntryFieldStyle" TargetType="Grid" >
        <Setter Property="HorizontalAlignment" Value="Stretch" />
        <Setter Property="VerticalAlignment" Value="Center" />
        <Setter Property="Margin" Value="2" />
    </Style>
</Window.Resources>

My Viewmodel is as followes:

region WindowVisibility

    private bool _windowVisibility=true;
    public bool WindowVisibility
    {
        get { return _windowVisibility; }
        set { _windowVisibility = value;
            OnPropertyChanged("WindowVisibility");
        }
    }

    #endregion

Converter is

public class BooleanToVisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null)
            {
                if ((bool)value)
                    return Visibility.Visible;
                else
                    return Visibility.Collapsed;
            }
            else
                return Visibility.Collapsed;
        }

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

This converter works properly with other controls but with this Window it is not working . I would like to know does converter works with Window level or only on controls?


Solution

  • The declaration of the converter in the Resources collection should be before the reference to the converter.

    You can fix it like this:

    <Window x:Class="UI.ChildWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:UI"
            xmlns:UtilityValue="clr-namespace:UI.Utility"
            xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"        
            mc:Ignorable="d"
            Title="ChildWindow" Height="70" Width="400" WindowStartupLocation="CenterScreen" WindowStyle="None">
        <Window.Resources>
            <UtilityValue:TextInputToVisibilityConverter x:Key="TextInputToVisibilityConverter"></UtilityValue:TextInputToVisibilityConverter>
            <UtilityValue:EventToCommandBehavior x:Key="CommandBehavior"></UtilityValue:EventToCommandBehavior>
            <SolidColorBrush x:Key="brushWatermarkBackground" Color="White" />
            <SolidColorBrush x:Key="brushWatermarkForeground" Color="LightSteelBlue" />
            <SolidColorBrush x:Key="brushWatermarkBorder" Color="Indigo" />
            <UtilityValue:BooleanToVisibilityConverter x:Key="VisibilityConverter"></UtilityValue:BooleanToVisibilityConverter>
            <Style x:Key="EntryFieldStyle" TargetType="Grid" >
                <Setter Property="HorizontalAlignment" Value="Stretch" />
                <Setter Property="VerticalAlignment" Value="Center" />
                <Setter Property="Margin" Value="2" />
            </Style>
        </Window.Resources>
    
        <Window.Visibility>
            <Binding Path="WindowVisibility" Converter="{StaticResource VisibilityConverter}" Mode="TwoWay" />
        </Window.Visibility>
    </Window>