2016-11-21 14 views
0

У меня есть следующий XAML текстовое поле:Multi-значение конвертер не accesssable

<TextBox x:Name="TextBoxShippingLabel" Margin="0,10,-2,2" TextWrapping="Wrap"> 
    <TextBox.Text> 
     <MultiBinding StringFormat="{}{0} {1}&#x0a;{2}&#x0a;{3}&#x0a;{4}&#x0a;{5}&#x0a;{6} {7}" Converter="{local:ShippingLabelConverter}"> 
      <Binding ElementName="dataGridOutstandingOrders" Path="SelectedItem[FirstName]" /> 
      <Binding ElementName="dataGridOutstandingOrders" Path="SelectedItem[Surname]" /> 
      <Binding ElementName="dataGridOutstandingOrders" Path="SelectedItem[Department]" /> 
      <Binding ElementName="dataGridOutstandingOrders" Path="SelectedItem[Organisation]" /> 
      <Binding ElementName="dataGridOutstandingOrders" Path="SelectedItem[Street]" /> 
      <Binding ElementName="dataGridOutstandingOrders" Path="SelectedItem[Suburb]" /> 
      <Binding ElementName="dataGridOutstandingOrders" Path="SelectedItem[State]" /> 
      <Binding ElementName="dataGridOutstandingOrders" Path="SelectedItem[Postcode]" /> 
     </MultiBinding> 
    </TextBox.Text> 
</TextBox> 

Я пытаюсь связать это с преобразователем, который представляет следующее:

namespace CIC.OrderProcessor 
{ 
    public class ShippingLabelConverter : IMultiValueConverter 
    { 
     public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      var output = new StringBuilder(); 

      foreach (var param in values.Cast<string>().Where(param => param != "None")) 
      { 
       output.Append(param); 
      } 

      return output.ToString(); 
     } 

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

Однако Visual Studio является рассказывал мне следующее:

название «ShippingLabelConverter» не существует в пространстве имен «CLR-namespa се: CIC.OrderProcessor».

Недопустимый тип расширения разметки: ожидается тип «IMultiValueConverter», фактический тип «ShippingLabelConverter»

Я проверил пространство имен для моего преобразователя класса, и это, безусловно, правильно. Он также наследует тип «IMultiValueConvterer», поэтому я немного не уверен, куда идти дальше - ошибки кажутся им очевидными, но я не вижу никаких изменений, которые я должен сделать.

Экстренная Информация

Декларация локального пространства имен из моего XAML выглядит следующим образом:

<Window x:Class="CIC.OrderProcessor.MainWindow" 
     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:CIC.OrderProcessor" 
+0

Не могли бы вы показать пространство имен вашего класса конвертера и определение локального пространства имен в вашем xaml – Daniel

ответ

1

По сути вы должны создать экземпляр преобразователя, прежде чем вы можете использовать его:

<Window.Resources> 
    <local:ShippingLabelConverter x:Key="shippingLabelConverter" /> 
</Window.Resources> 

и

<MultiBinding StringFormat="{}{0} {1}&#x0a;{2}&#x0a;{3}&#x0a;{4}&#x0a;{5}&#x0a;{6} {7}" Converter="{StaticResource shippingLabelConverter}"> 

Альтернатива: Существует альтернатива, которая заключается в реализации другого интерфейса «MarkupExtension», поэтому конвертер знает, как предоставить экземпляр сам по себе. Ознакомьтесь с этой статьей: http://drwpf.com/blog/2009/03/17/tips-and-tricks-making-value-converters-more-accessible-in-markup/

public class DummyConverter : MarkupExtension, IValueConverter 
{ 
    private static DummyConverter _converter = null; 
    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     if (_converter == null) 
     { 
      _converter = new DummyConverter(); 
     } 
     return _converter; 
    } 
    #region IValueConverter Members 
    ... 
    #endregion 
} 
0

Я думаю, вам нужно определить статический ресурс. В вашем XAML:

<local:ShippingLabelConverter x:Key="shippingLabelConverter" /> 

Ваше текстовое поле

 <MultiBinding StringFormat="{}{0} {1}&#x0a;{2}&#x0a;{3}&#x0a;{4}&#x0a;{5}&#x0a;{6} {7}" Converter="{StaticResource shippingLabelConverter}">