2010-05-18 4 views
2

Étant donné que vous ne pouvez pas créer un DataTemplate Silverlight en C#, j'essaie d'en créer un en XAML. J'ai un convertisseur auquel je dois me référer, que j'ai défini en C# dans un autre espace de nommage. J'ai essayé de le faire:Comment faire référence à un convertisseur de liaison dans un autre espace de nom dans Silverlight XAML?

<UserControl.Resources> 
     <DataTemplate x:Key="PriceTemplate"> 
      <TextBlock Text="{Binding Price, Converter={Converters:PriceConverter}}" /> 
     </DataTemplate> 
    </UserControl.Resources> 

Où Convertisseurs est un xmlns qui pointe vers l'espace de noms correct. Cependant, je reçois une erreur de compilation qui dit:

Type « Convertisseurs: PriceConverter » est utilisé comme une extension de balisage, mais ne pas de dériver MarkupExtension.

J'ai essayé d'ajouter System.Windows.Markup.MarkupExtension en tant que parent à mon convertisseur, mais il n'existe apparemment pas dans Silverlight.

Comment puis-je faire référence à mon convertisseur en XAML, sans avoir à le réécrire en XAML?

Répondre

10

Vous souhaitez d'abord créer une ressource statique, puis vous lier au convertisseur qui est une ressource statique.

<UserControl.Resources> 
    <conv:IntConverter x:Key="IntConverter"></conv:IntConverter> 
</UserControl.Resources> 
<StackPanel> 
    <TextBlock x:Name="Result" Margin="15" FontSize="20" 
       HorizontalAlignment="Center" VerticalAlignment="Center" 
       Text="{Binding Converter={StaticResource IntConverter}}"> 
    </TextBlock> 
</StackPanel> 
</Window> 

Ainsi, le « conv: » espace de noms XML a été enregistré au début du document comme vous le faites avec des contrôles personnalisés:

xmlns:conv="clr-namespace:MyFooCompany.Converters" 

Cet exemple est adapté du tutoriel ci-dessous lié au sujet de la même question pour WPF:

http://www.dev102.com/2008/07/17/wpf-binding-converter-best-practices/

3

Vous semblez confondre avec les types d'instances. Un convertisseur type existera "dans" un espace de nommage mais dans la liaison nous ne spécifions pas un type comme le convertisseur. Au lieu de cela, nous donnons à la liaison une instance réelle de ce type.

Généralement IValueConverter instances sont sans état, par conséquent, nous pouvons contenir une instance commune n'importe où dans la chaîne de dictionnaires de ressources disponibles où l'instance d'un DataTemplate est chargé.

En xaml, nous pouvons référencer un autre espace de noms en créant un nouvel alias pour le couvrir. Dans cet esprit votre xaml pourrait ressembler à quelque chose comme ceci: -

<UserControl x:Class="SilverlightApplication1.UserControl1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:SilverlightApplication1" 
    xmlns:localConverters="clr-namespace:SilverlightApplication1.Converters"> 
    <UserControl.Resources> 
     <localConverters:PriceConverter x:Key="PriceConverter" /> 
     <DataTemplate x:Key="Test"> 
      <TextBlock Text="{Binding Price, Converter={StaticResource PriceConverter}}" /> 
     </DataTemplate> 
    </UserControl.Resources> 
Questions connexes