0

Проблема в том что конвертер не хочет роботать в ResourceDictionary(ListBox.xaml) если он подключен в App.xaml,только если на прямую его подключить в ListBox.xaml <converters:BoolToStringConverter x:Key="BoolToString" /> все будет ок.

Ошибка:Exception: Cannot find resource named 'BoolToString'.Resource names are case sensitive.(То есть ненаход BoolToString но видит при подключении все конвертори).

Что я собственно хочу получить:Можно как-то конвертер получить из App.xaml в ListBox.xaml просто не вариат использовать только в ListBox.xaml.

ListBox.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                     xmlns:converters="clr-namespace:PriceCreator.Services.Converters"
                    >
    <converters:BoolToStringConverter   x:Key="BoolToString" />
    <ControlTemplate x:Key="VideoListItems" TargetType="ListBoxItem">
    &lt;Grid&gt;
        &lt;Border   
            Name=&quot;brd&quot;
            Margin=&quot;10,2&quot;
            Background=&quot;{StaticResource MediumBrush}&quot;
            CornerRadius=&quot;2&quot;&gt;
            &lt;Grid  &gt;
                &lt;Grid.RowDefinitions&gt;
                    &lt;RowDefinition Height=&quot;25*&quot;/&gt;
                    &lt;RowDefinition Height=&quot;22*&quot;/&gt;
                    &lt;RowDefinition Height=&quot;26*&quot;/&gt;
                    &lt;RowDefinition Height=&quot;818*&quot;/&gt;
                &lt;/Grid.RowDefinitions&gt;
                &lt;TextBlock x:Name=&quot;Name&quot;  FontWeight=&quot;Bold&quot; Foreground=&quot;Gray&quot;   Style=&quot;{StaticResource BaseText}&quot; FontSize=&quot;18&quot;
                       Margin=&quot;5&quot; TextTrimming=&quot;CharacterEllipsis&quot;  Text=&quot;{Binding  Name,StringFormat=Имя товара:{0}}&quot; TextAlignment=&quot;Center&quot;  VerticalAlignment=&quot;Center&quot;/&gt;
                &lt;Grid Grid.Row=&quot;1&quot;&gt;
                    &lt;Grid.ColumnDefinitions&gt;
                        &lt;ColumnDefinition Width=&quot;142*&quot;/&gt;
                        &lt;ColumnDefinition Width=&quot;38*&quot;/&gt;
                        &lt;ColumnDefinition Width=&quot;229*&quot;/&gt;
                        &lt;ColumnDefinition Width=&quot;365*&quot;/&gt;
                    &lt;/Grid.ColumnDefinitions&gt;
                    &lt;TextBlock    Margin=&quot;2&quot; x:Name=&quot;Price&quot;  Grid.Column=&quot;0&quot;  Text=&quot;{Binding Price,StringFormat=Цена:{0}}&quot;   FontWeight=&quot;Bold&quot; Foreground=&quot;Gray&quot;   Style=&quot;{StaticResource BaseText}&quot; FontSize=&quot;18&quot; VerticalAlignment=&quot;Center&quot; HorizontalAlignment=&quot;Right&quot; /&gt;
                    &lt;TextBlock    Margin=&quot;2&quot; x:Name=&quot;CurrencyId&quot; Grid.Column=&quot;1&quot;  Text=&quot;{Binding CurrencyId}&quot;   FontWeight=&quot;Bold&quot; Foreground=&quot;Gray&quot;   Style=&quot;{StaticResource BaseText}&quot; FontSize=&quot;18&quot; VerticalAlignment=&quot;Center&quot; /&gt;
                    &lt;TextBlock    FontWeight=&quot;Bold&quot; Foreground=&quot;Gray&quot;   Style=&quot;{StaticResource BaseText}&quot;  Margin=&quot;2&quot; x:Name=&quot;Stock_quantity&quot; Grid.Column=&quot;2&quot;  Text=&quot;{Binding Stock_quantity,StringFormat=Количество товаров:{0}}&quot; FontSize=&quot;18&quot; VerticalAlignment=&quot;Center&quot;  /&gt;
                    &lt;TextBlock    TextTrimming=&quot;CharacterEllipsis&quot; FontWeight=&quot;Bold&quot; Foreground=&quot;Gray&quot;   Style=&quot;{StaticResource BaseText}&quot;  Margin=&quot;2&quot; x:Name=&quot;Vendor&quot; Grid.Column=&quot;3&quot;  Text=&quot;{Binding Vendor,StringFormat=Производитель товара:{0}}&quot;     FontSize=&quot;18&quot; VerticalAlignment=&quot;Center&quot;/&gt;
                &lt;/Grid&gt;
                &lt;Grid Grid.Row=&quot;2&quot;&gt;
                    &lt;Grid.ColumnDefinitions&gt;
                        &lt;ColumnDefinition Width=&quot;251*&quot;/&gt;
                        &lt;ColumnDefinition Width=&quot;523*&quot;/&gt;
                    &lt;/Grid.ColumnDefinitions&gt;
                    &lt;TextBlock Style=&quot;{StaticResource BaseText}&quot; Margin=&quot;2&quot; Text=&quot;{Binding Available,StringFormat=Есть товар в наличии:{0},Converter={StaticResource BoolToString}}&quot; FontSize=&quot;18&quot; FontWeight=&quot;Bold&quot;  Foreground=&quot;Gray&quot;  /&gt;
                &lt;/Grid&gt;


            &lt;/Grid&gt;
        &lt;/Border&gt;

        &lt;!--&lt;Polygon
            Name=&quot;triangle&quot;
            Margin=&quot;2&quot;
            HorizontalAlignment=&quot;Left&quot;
            VerticalAlignment=&quot;Center&quot;
            Fill=&quot;{Binding ElementName=brd, Path=Background}&quot;
            Points=&quot;0,0 20,15, 0,30&quot;
            Visibility=&quot;Hidden&quot; /&gt;--&gt;
    &lt;/Grid&gt;


    &lt;ControlTemplate.Triggers&gt;
        &lt;Trigger Property=&quot;IsSelected&quot; Value=&quot;true&quot;&gt;
            &lt;Setter TargetName=&quot;brd&quot; Property=&quot;Background&quot; Value=&quot;{StaticResource BrushBlue}&quot; /&gt;
            &lt;!--&lt;Setter TargetName=&quot;triangle&quot; Property=&quot;Visibility&quot; Value=&quot;Visible&quot; /&gt;--&gt;
            &lt;Setter TargetName=&quot;Name&quot; Property=&quot;Foreground&quot; Value=&quot;White&quot; /&gt;
            &lt;Setter TargetName=&quot;Price&quot; Property=&quot;Foreground&quot; Value=&quot;White&quot; /&gt;
            &lt;Setter TargetName=&quot;CurrencyId&quot; Property=&quot;Foreground&quot; Value=&quot;White&quot; /&gt;
            &lt;Setter TargetName=&quot;Vendor&quot; Property=&quot;Foreground&quot; Value=&quot;White&quot; /&gt;
            &lt;Setter TargetName=&quot;Stock_quantity&quot; Property=&quot;Foreground&quot; Value=&quot;White&quot; /&gt;
            &lt;!--&lt;Setter TargetName=&quot;Id&quot; Property=&quot;Foreground&quot; Value=&quot;White&quot; /&gt;--&gt;
        &lt;/Trigger&gt;

        &lt;Trigger Property=&quot;IsMouseOver&quot; Value=&quot;true&quot;&gt;
            &lt;Setter TargetName=&quot;brd&quot; Property=&quot;Background&quot; Value=&quot;{StaticResource BrushBlue}&quot; /&gt;
            &lt;Setter TargetName=&quot;Name&quot; Property=&quot;Foreground&quot; Value=&quot;White&quot; /&gt;
            &lt;Setter TargetName=&quot;Price&quot; Property=&quot;Foreground&quot; Value=&quot;White&quot; /&gt;
            &lt;Setter TargetName=&quot;CurrencyId&quot; Property=&quot;Foreground&quot; Value=&quot;White&quot; /&gt;
            &lt;Setter TargetName=&quot;Vendor&quot; Property=&quot;Foreground&quot; Value=&quot;White&quot; /&gt;
            &lt;Setter TargetName=&quot;Stock_quantity&quot; Property=&quot;Foreground&quot; Value=&quot;White&quot; /&gt;
            &lt;!--&lt;Setter TargetName=&quot;Id&quot; Property=&quot;Foreground&quot; Value=&quot;White&quot; /&gt;--&gt;
        &lt;/Trigger&gt;
    &lt;/ControlTemplate.Triggers&gt;
&lt;/ControlTemplate&gt;

</ResourceDictionary>

App.xaml

<Application x:Class="PriceCreator.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:converters="clr-namespace:PriceCreator.Services.Converters"
             StartupUri="Views\PriceCeatorView.xaml">
    <Application.Resources>
        <!--Подключение ресурсов-->
        <ResourceDictionary >
         <!--Подключение конвертеров-->
         <converters:StringTointConverter x:Key="StringToint" />
         <converters:IntToVisibilityConverter x:Key="IntToVisibility" />
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Styles\Colors.xaml"/>
                <ResourceDictionary Source="Styles\Fonts.xaml"/>
                <!--<ResourceDictionary Source="Styles\Icons.xaml" />-->
                <ResourceDictionary Source="Styles\ScrollViewer.xaml" />
                <ResourceDictionary Source="Styles\Texts.xaml" />
                <ResourceDictionary Source="Styles\Buttons.xaml" />
                <!--<ResourceDictionary Source="Styles\RadioButton.xaml" />-->
                <!--<ResourceDictionary Source="Styles\ContentControls.xaml" />
                <ResourceDictionary Source="Styles\UserControl.xaml" />-->
                <ResourceDictionary Source="Styles\ListBox.xaml" />
        &lt;/ResourceDictionary.MergedDictionaries&gt;
    &lt;/ResourceDictionary&gt;
&lt;/Application.Resources&gt;

</Application>

Vladimir
  • 403
  • Знаете что я вам советую... Используйте MarkupExtension и не надо будет захламлять ресурсы лишним, ибо достаточно будет указать напрямую нужный конвертор (<TextBlock Text = "{Binding Text, Converter= {conv:MyExtension}}"/>). – EvgeniyZ Jul 11 '20 at 13:11
  • @EvgeniyZ вы об этом ссылка WPF MarkupExtension, использование строк с несколькими ресурсами? – Vladimir Jul 11 '20 at 13:54
  • Именно. Тут помниться АндейNOP делал как то некий базовый класс, от которого потом удобно наследовать любой конвертор и переопределив всего один Convert получить в итоге готовый конвертор в виде расширения разметки. Можете глянуть его ответы на эту тему, а сам базовый класс можно взять например тут. – EvgeniyZ Jul 11 '20 at 14:16
  • @EvgeniyZ Спасибо вам все шикарно работает, зачем нужен ProvideValue,не пойму зачем MarkupExtension какая его тут функция?? – Vladimir Jul 11 '20 at 21:54
  • Если просто, то это некий провайдер источника данных. То есть вам нужно допустим привязаться на уровень выше (такое бывает, если объект находится в коллекции, а его надо привязать к свойству, которое за пределами коллекции), обычно это пишется так: {Binding Value, elativeSource={RelativeSource FindAncestor, AncestorType=Control}, а можно сделать расширение разметки, которое будет использоваться как {ex:Convert DataContext.Value}. Вот допустим другой вариант, привязка Enum. – EvgeniyZ Jul 12 '20 at 01:01
  • @EvgeniyZ Я понял о чем вы место подниматься по дереву xaml до Window для получения данных в xaml разметке,мы делаем это программно то есть с# коде? Cпасибо вам что помогли)) – Vladimir Jul 12 '20 at 11:45

1 Answers1

0

Подключение конвертера xmlns:converters="clrnamespace:PriceCreator.Services.Converters"-у меня в папке Services есть папка Converters.

Базовый класс для создания конвертеров:

 abstract class ConverterBase : MarkupExtension, IValueConverter
 {
            public abstract object Convert(object value, Type targetType, object parameter, CultureInfo culture);
            public virtual object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)=> throw new NotImplementedException();
            public override object ProvideValue(IServiceProvider serviceProvider) => this;
 }

Пример конвертер С Bool в String:

class BoolToStringConverter : ConverterBase
{
    public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool v = System.Convert.ToBoolean(value);
        return v ? &quot;Да&quot; : &quot;Нет&quot;;
    }

}

Пример использования тип данных являться Bool(Available).

<TextBlock x:Name="Available"  Margin="2"  Grid.Column="1" Style="{StaticResource BaseText}"  Text="{Binding Available,StringFormat=Есть товар в наличии:{0},Converter={converters:BoolToStringConverter}}" FontSize="18" FontWeight="Bold"  Foreground="Gray"  />
Vladimir
  • 403