Heute hatte ich eine interessante Diskussion mit Norbert auf .NET GUI. Unter anderem habe ich gelernt, dass es Probleme geben kann, wenn beim Import eines lokalen Namespace in ein XAML File der Assemblyname mit angegeben wird. Hier ein Beispiel:
In der Assembly DataTemplateDemo gibt es eine Klasse Data:
namespace DatatemplateDemo
{
public class Data
{
private string _name;
public Data(string name)
{
_name = name;
}
public string Name
{
get { return _name; }
}
}
}
Im UI wird ein DataTemplate für diesen Typ definiert:
<Window x:Class="DatatemplateDemo.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:DatatemplateDemo;assembly=DatatemplateDemo"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<DataTemplate x:Key="DataTemplate_Data" DataType="{x:Type local:Data}">
<StackPanel Orientation="Horizontal">
<TextBlock Margin="2" Text="Name: "/>
<TextBlock Margin="2" Text="{Binding Path=Name}"/>
</StackPanel>
</DataTemplate>
</Window.Resources>
<Grid>
<ListBox x:Name="_listBox" ItemTemplate="{StaticResource DataTemplate_Data}"/>
</Grid>
</Window>
Wenn man nun versucht diesen Code zu übersetzen wird man mit dieser Fehlermeldung konfrontiert:
error MC3066: The type reference cannot find a public type named ‘Data’. Line 8 Position 80.
Nach einigem Rumprobieren hat sich herausgestellt, dass die Übersetzung wunderbar klappt, wenn bei der Deklaration des XML Namespace die Assembly weggelassen wird:
<Window x:Class="DatatemplateDemo.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:DatatemplateDemo"
Title="Window1" Height="300" Width="300">
...
</Window>
Der Fehler tritt nicht nur mit DataTemplates auf, sondern z.B. auch wenn man einen Style definiert und der TargetType entsprechend angegeben wird.
Ich merke mir: wenn ein Namespace aus einem lokalen Assembly in ein XAML File mit xmlns importiert wird, gebe ich den “assembly” Parameter NICHT mit an! Vielleicht erspart die Info ja dem einen oder anderen die Fehlersuche. Ach ja, das Intellisense des Visual Studio macht es automatisch so und gibt den “assembly” Parameter nicht mit an, wenn der importierte CLR Namespace im gleichen Assembly liegt.