Похоже, что мой первоначальный ответ был вызван неправильным пониманием вопроса, и требование не касается селектора шаблона данных, а скорее о том, как параметризовать свойство, к которому привязана привязка, чтобы вы могли использовать один и тот же шаблон для двух разных свойств. .
Быстрый ответ: XAML не предназначен для использования. Вы не можете параметризовать свойство Path
объекта Binding
. Обычное решение - написать по одному шаблону для каждого случая. Было бы неплохо, если бы вы могли указать, какое свойство / поле должно отображаться DataGridTemplateColumn
, через свойство Binding
или DisplayMemberPath
, а затем передать это значение в шаблон, но это не работает.
Я нашел здесь вероятный обходной путь, но я не уверен, что рентабельность инвестиций будет хорошо складываться по сравнению с копированием. и вставляем DataTemplate
и продолжаем жить своей жизнью.
Если шаблоны достаточно сложны для обслуживания, вы можете обойти это следующим образом:
Ресурсы XAML:
<DataTemplate x:Key="RedBaseTemplate">
<Border BorderBrush="Green" BorderThickness="2" Margin="1">
<Label x:Name="Text" Background="Red" Content="{Binding}" />
</Border>
</DataTemplate>
<DataTemplate x:Key="GreenBaseTemplate">
<Border BorderBrush="Red" BorderThickness="2" Margin="1">
<Label x:Name="Text" Background="Green" Content="{Binding}" />
</Border>
</DataTemplate>
<DataTemplate x:Key="RedTemplateA">
<ContentControl
Content="{Binding A}"
ContentTemplate="{StaticResource RedBaseTemplate}"
/>
</DataTemplate>
<DataTemplate x:Key="RedTemplateB">
<ContentControl
Content="{Binding B}"
ContentTemplate="{StaticResource RedBaseTemplate}"
/>
</DataTemplate>
<DataTemplate x:Key="GreenTemplateA">
<ContentControl
Content="{Binding A}"
ContentTemplate="{StaticResource GreenBaseTemplate}"
/>
</DataTemplate>
<DataTemplate x:Key="GreenTemplateB">
<ContentControl
Content="{Binding B}"
ContentTemplate="{StaticResource GreenBaseTemplate}"
/>
</DataTemplate>
Исходный ответ
Это общий шаблон: вам нужно несколько экземпляров одного и того же DataTemplateSelector
(или преобразователя значений, довольно часто), но с разными параметрами. Решение состоит в том, чтобы унаследовать от MarkupExtension
, чтобы вы могли создать экземпляр объекта в точке использования с его собственными уникальными параметрами, а не создавать один общий экземпляр где-то еще в качестве ресурса. В этом случае DataTemplateSelector
- это класс, а не интерфейс, поэтому вы не можете унаследовать свой селектор от MarkupExtension
. Вместо этого вы пишете быстрое MarkupExtension
, которое возвращает ваш селектор.
Я хотел передать сами шаблоны RedGreenTemplateSelectorExtension
, используя StaticResource
или DynamicResource
в XAML, но парсеру XAML эта идея не понравилась. Но это работает достаточно хорошо.
public class RedGreenTemplateSelectorExtension : MarkupExtension
{
public Object RedTemplateKey { get; set; }
public Object GreenTemplateKey { get; set; }
public override object ProvideValue(IServiceProvider serviceProvider)
{
var redTemplate = new StaticResourceExtension(RedTemplateKey)
.ProvideValue(serviceProvider) as DataTemplate;
var greenTemplate = new StaticResourceExtension(GreenTemplateKey)
.ProvideValue(serviceProvider) as DataTemplate;
return new RedGreenTemplateSelector() {
RedTemplate = redTemplate,
GreenTemplate = greenTemplate
};
}
}
public class RedGreenTemplateSelector : DataTemplateSelector
{
public DataTemplate RedTemplate { get; set; }
public DataTemplate GreenTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item is RedItem)
return RedTemplate;
else if (item is GreenItem)
return GreenTemplate;
else
return base.SelectTemplate(item, container);
}
}
XAML
<StackPanel>
<ContentControl
ContentTemplateSelector="{local:RedGreenTemplateSelector RedTemplateKey=RedTemplate, GreenTemplateKey=GreenTemplate}"
>
<local:RedItem/>
</ContentControl>
<ContentControl
ContentTemplateSelector="{local:RedGreenTemplateSelector RedTemplateKey=RedTemplate, GreenTemplateKey=GreenTemplate}"
>
<local:GreenItem/>
</ContentControl>
</StackPanel>
P.S. StaticResource
и _ 19_ являются два очень разных класса, которые делают разные вещи. Люди неправильно используют слово «привязка» для обозначения «поручения». Это не. Здесь вы вообще не используете никаких привязок.
person
15ee8f99-57ff-4f92-890c-b56153
schedule
21.12.2016