ParameterizedResource ru - Leksiqq/WpfMarkupExtension GitHub Wiki
Применяется в разметке XAML аналогично <StaticResource>
или {StaticResource ResourceKeyValue}
. Действует так же, но при обнаружении в значении некоторых атрибутов символа $ определяет его как начало имени параметра и пытается подставить вместо параметра заданную замену.
поиск параметров производится:
- В элементах
<Binding>
или{Binding ... }
Path
ElementName
ConverterParameter
Source
XPath
- В элементах
<MultiBinding>
ConverterParameter
- В элементах
<l:ParameterizedResource>
(предполагается, что объявлен префикс:xmlns:l="clr-namespace:Net.Leksi.WpfMarkup;assembly=Net.Leksi.WpfMarkupExtension"
)ResourceKey
Важно! Следует иметь в виду, что при использовании параметров ресурс должен быть объявлен с атрибутом x:Shared="False"
, так как в противном случае подстановка будет выполнена только один раз при создании единственного экземпляра!
-
public static bool DefaultSrict { get; set; } = false;
- значение по умолчанию для ствойстваStrict
экземпляров класса. -
ResourceKey
- Получает или задает значение ключа, передаваемое данной статической ссылкой ресурса. Ключ используется для возврата объекта, имеющего соответствующий ключ в словаре ресурсов. Варианты синтаксиса:- в атрибуте:
{l:ParameterizedResource ResourceKeyValue ... }
- в элементе:
- в атрибуте:
<l:ParameterizedResource ResourceKey="ResourceKeyValue"/>
-
Replaces
- массив строк и/или именованныхBindingProxy
, описывающий подстановки параметров. Наследуется вышележащими вызовамиProvideValue
в стеке. При необходимости подстановки используется самое позднее встреченное в стеке вызововProvideValue
определение. Варианты синтаксиса:- в атрибуте:
{l:ParameterizedResource ResourceKeyValue, Replaces=$param1:replace1|$param2:replace2... }
- возможно только использование строк; - в элементе:
- в атрибуте:
<l:ParameterizedResource ResourceKey="ResourceKeyValue">
<x:Array Type="sys:Object">
<sys:String>$param1:replace1</sys:String>
<sys:String>$param2:replace2</sys:String>
<l:BindingProxy Name="$param3" Value="{Binding ...}"/>
<l:BindingProxy Name="$param4" Value="{x:Null}"/>
...
</x:Array>
...
</l:ParameterizedResource>
или
<l:ParameterizedResource ResourceKey="ResourceKeyValue">
<l:ParameterizedResource.Replaces>
<x:Array Type="sys:String">
<sys:String>$param1:replace1</sys:String>
<sys:String>$param2:replace2</sys:String>
<l:BindingProxy Name="$param3" Value="{Binding ...}"/>
<l:BindingProxy Name="$param4" Value="{x:Null}"/>
...
</x:Array>
</l:ParameterizedResource.Replaces>
...
</l:ParameterizedResource>
-
Defaults
массив строк, описывающий подстановки параметров. Не наследуется вышележащими вызовамиProvideValue
в стеке. Если для параметра задано значение по умолчанию, то оно подставляется, когда соответствующая подстановка не задана ранее в стеке вызововProvideValue
. Варианты синтаксиса:- в атрибуте:
{l:ParameterizedResource ResourceKeyValue, Defaults=$param1:default1|$param2:default2... }
- в элементе:
- в атрибуте:
<l:ParameterizedResource ResourceKey="ResourceKeyValue">
<l:ParameterizedResource.Defaults>
<x:Array Type="sys:String">
<sys:String>$param1:default1</sys:String>
<sys:String>$param2:default2</sys:String>
...
</x:Array>
</l:ParameterizedResource.Defaults>
...
</l:ParameterizedResource>
-
At
- произвольная строковая метка для отслеживания при отладке (смотритеVerbose
ниже). Варианты синтаксиса:- в атрибуте:
{l:ParameterizedResource ResourceKeyValue, At=AtValue ... }
- в элементе:
- в атрибуте:
<l:ParameterizedResource ResourceKey="ResourceKeyValue" At="AtValue"/>
-
Verbose
- степень детализации вывода на консоль при отладке, по умолчанию -0
- отсутствие вывода. Значение1
приводит к выводу на консоль вызововProvideValue
и действия с параметрами: наследование подстановок и сами подстановки; значение2
кроме перечисленного выводит все проверяемые элементы логического и визуального деревьев. Следует иметь в виду, что для вывода на консоль приложение должно компилироваться как "Консольное приложение". Варианты синтаксиса:- в атрибуте -
{l:ParameterizedResource ResourceKeyValue, Verbose=VerboseValue ... }
- в элементе:
- в атрибуте -
<l:ParameterizedResource ResourceKey="ResourceKeyValue", Verbose="VerboseValue"/>
-
Strict
- булева переменная, по умолчанию - значение статического свойстваDefaultSrict
- вызываетSystem.Windows.Markup.XamlParseException
, если какой-то параметр остался не подставленным. Значениеfalse
приводит к выводу на консоль соответствующего сообщения при условии, что приложение скомпилировано как "Консольное приложение". Варианты синтаксиса:- в атрибуте -
{l:ParameterizedResource ResourceKeyValue, Strict=False... }
- в элементе:
- в атрибуте -
<l:ParameterizedResource ResourceKey="ResourceKeyValue", Strict="False"/>
-
AsValueOfType
- переменная типаType
, по умолчаниюnull
. Если неnull
, преобразует значениеResourceKey
в указанный тип. Варианты синтаксиса:- в атрибуте -
{l:ParameterizedResource ResourceKeyValue, AsValueOfType={x:Type TypeName}... }
- в элементе:
- в атрибуте -
<l:ParameterizedResource ResourceKey="ResourceKeyValue", AsValueOfType="{x:Type TypeName}"/>
Например:
<DataGrid ItemsSource="{Binding KeysViewSource.View}" AutoGenerateColumns="False" Margin="10,10,10,10">
<DataGrid.Resources>
<local:KeyValueDataTemplateSelector x:Key="KeyValueTemplate" x:Shared="False"
IsEditing="{l:ParameterizedResource $IsEditing, AsValueOfType={x:Type sys:Boolean}}">
<local:KeyValueDataTemplateSelector.View>
<DataTemplate>
<TextBlock Text="{Binding Item2}"/>
</DataTemplate>
</local:KeyValueDataTemplateSelector.View>
<local:KeyValueDataTemplateSelector.Edit>
<DataTemplate>
<TextBox Text="{Binding Item2}"/>
</DataTemplate>
</local:KeyValueDataTemplateSelector.Edit>
</local:KeyValueDataTemplateSelector>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="Ключ" Binding="{Binding Item1}" IsReadOnly="True"/>
<DataGridTemplateColumn Header="Значение"
CellTemplateSelector="{l:ParameterizedResource KeyValueTemplate, Replaces=$IsEditing:False}"
CellEditingTemplateSelector="{l:ParameterizedResource KeyValueTemplate, Replaces=$IsEditing:True}"
/>
</DataGrid.Columns>
</DataGrid>
В качестве примеров предлагается проследить в демо на вкладке «Demo2» шаблоны CellTemplateSelector
и CellEditingTemplateSelector
в DataGrid
и ресурсы для них в файле Dictionary2.xaml
.
Раньше: (StyleCombiner) Начало:(Обзор) Дальше:(XamlServiceProviderCatcher)