views:

54

answers:

2

I'm trying to use a value converter. However, VS is complaining about this XAML:

<Grid x:Name="LayoutRoot" Background="White" Height="Auto" Width="Auto">

    <Grid.Resources>
        <local:DateFormatter x:Key="FormatConverter" />
    </Grid.Resources>

The error:

The type 'local:DateFormatter' was not found. Verify that you are not missing an assembly reference and that all referenced assemblies have been built.

Am I missing an assembly reference, or is my XAML incorrect? I'm trying to follow an example on MSDN.

Update: I added the following attribute to UserControl:

xmlns:local="clr-namespace:MyNamespace"

I also added a DateFormatter class.

Now Intellisense pops up with "local" and "DateFormatter". However, it still gives the same error as above. The error does not occur for other types, such as App.

DateFormatter:

using System;
...

namespace MyNamespace
{
    public class DateFormatter : IValueConverter
    {

        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            DateTime date = (DateTime) value;
            return date.ToShortDateString();
        }

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

        #endregion
    }
}
+3  A: 

Yes - you need to add an xmlns:local="clr-namespace:SilverlightApplication6" to map the namespace and assembly to the XAML namespace local. If you add the converter via Expression Blend, it will put the correct namespace declaration in for you.

Michael S. Scherotter
That produces an error: "A namespace prefix declaration cannot be empty."
Rosarch
+3  A: 

As Michael S. Scherotter says, you'll need to add a namespace reference in XAML.

If you're following the MSDN article you'll need to include the following:

xmlns:local="clr-namespace:YOUR-NAMESPACE-HERE"

This is similar to a using statement in C#. It tells XAML where to find your DateFormatter type.


Update:

I'm not sure what's going wrong for you.

The following works for me (applying your DateFormatter code but in a different namespace):

MainPage.xaml

<UserControl x:Class="SilverlightApplication2.MainPage"
    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:local="clr-namespace:SilverlightApplication2">

    <Grid x:Name="LayoutRoot" Background="White">
        <Grid.Resources>
            <local:DateFormatter x:Key="FormatConverter" />
        </Grid.Resources>

        <TextBlock HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
                   Text="{Binding FooDate, Converter={StaticResource FormatConverter}}"/>
    </Grid>
</UserControl>

MainPage.xaml.cs

using System; using System.Windows.Controls;

namespace SilverlightApplication2
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();

            var foo = new Foo { FooDate = DateTime.Now };
            DataContext = foo;
        }
    }

    public class Foo
    {
        public DateTime FooDate { get; set; }
    }
}

DateFormmatter.cs

using System;
using System.Windows.Data;

namespace SilverlightApplication2
{
    public class DateFormatter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            DateTime date = (DateTime)value;
            return date.ToShortDateString();
        }

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