Как я могу сослаться на конвертер связывания в другом пространстве имен в Silverlight XAML? - PullRequest
2 голосов
/ 18 мая 2010

Поскольку вы, очевидно, не можете создать шаблон данных Silverlight в C #, я пытаюсь создать его в XAML. У меня есть конвертер, к которому я должен обратиться, который я определил в C # в другом пространстве имен. Я пытался сделать это:

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

Где Converters - это xmlns, указывающий на правильное пространство имен. Тем не менее, я получаю сообщение об ошибке компиляции:

Тип 'Конвертеры: PriceConverter' является используется как расширение разметки, но делает не выводится из MarkupExtension.

Я попытался добавить System.Windows.Markup.MarkupExtension в качестве родительского для моего конвертера, но, по-видимому, его нет в Silverlight.

Как я могу сослаться на мой конвертер в XAML, не переписывая его в XAML?

Ответы [ 2 ]

11 голосов
/ 19 мая 2010

Сначала необходимо создать статический ресурс, а затем привязать его к преобразователю, который является статическим ресурсом.

 <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>

Итак, пространство имен "conv:" xml было зарегистрировано в верхней части документа, как вы делаете это с помощью пользовательских элементов управления:

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

Этот пример адаптирован из приведенного ниже учебного пособия, касающегося той же проблемы для WPF:

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

3 голосов
/ 19 мая 2010

Вы, кажется, путаете Типы с Экземплярами. Преобразователь тип будет существовать «в» пространстве имен, однако в привязке мы не указываем тип в качестве преобразователя. Вместо этого мы даем привязке фактический экземпляр этого типа.

Как правило, IValueConverter экземпляры не имеют состояния, поэтому мы можем хранить общий экземпляр где угодно в цепочке словарей ресурсов, доступных там, где загружен экземпляр DataTemplate.

В xaml мы можем ссылаться на другое пространство имен, создавая новый псевдоним для его покрытия. Имея это в виду, ваш xaml может выглядеть примерно так: -

<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>
...