ContentControl с DataTemplateSelector - нужна помощь
У меня неприятная проблема... Может быть, кто-то может (пожалуйста!) Помочь. Я использую модель с перечислением типов и свойством, которое должно содержать модели пользовательского интерфейса для каждого выбранного типа из перечисления: давайте определим их следующим образом:
class ViewModel
{
Types selectedType{get;set;}
UiModelBase editedModel{get;set;}
}
Я хочу иметь элемент управления контентом, который использует dateatemplateselector, чтобы изменять его представление каждый раз, когда я меняю selectedType.
<ListBox x:Name="RuleTypeList" ItemsSource="{Binding Source={StaticResource Types}}" SelectedItem="{Binding Path=selectedType}"/>
<!--Content control-->
<ContentControl ContentTemplateSelector="{StaticResource ruleEditTemplateSelector}"
Content="{Binding SelectedItem, ElementName=RuleTypeList}"/>
ПРОБЛЕМА: В DataTemplates, которые я создаю, чтобы они возвращались ruleEditTemplateSelector, DataContext имеет тип (согласен с этим), но мне нужен доступ к editedModel для создания моего DataTemplate... Я не знаю, как с этим справиться
Заранее спасибо!
2 ответа
Решение было не очень сложным....
DataContext="{Binding RelativeSource={RelativeSource AncestorType=ContentControl},Path=DataContext}"
Таким образом, контекст шаблона совпадает с содержанием его родителя, и я могу получить доступ к его членам. Я думаю, что пытался сделать это, но я не правильно написал код... Спасибо Cstein за участие!
Если я вас правильно понял, вы хотите создать свой DataTemplate внутри шаблона templateselector, в то время как шаблон данных основан на свойстве editedModel.
Я бы решил эту проблему следующим образом:
Windows.xaml:
<Window.Resources>
<local:Selector x:Key="sel"/>
<DataTemplate x:Key="templateA">
<TextBlock Text="{Binding editedModel.PropertyName}"/>
</DataTemplate>
<DataTemplate x:Key="templateB">
<TextBlock Text="{Binding editedModel.PropertyName}"/>
</DataTemplate>
<DataTemplate x:Key="templateC">
<TextBlock Text="{Binding editedModel.PropertyName}"/>
</DataTemplate>
</Window.Resources>
Contentcontrol и listbox остаются прежними.
DataTemplateSelector:
public class Selector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item is ClassA)
return (container as FrameworkElement).FindResource("TemplateA") as DataTemplate;
else if (item is ClassB)
return (container as FrameworkElement).FindResource("TemplateB") as DataTemplate;
else if (item is ClassC)
return (container as FrameworkElement).FindResource("TemplateC") as DataTemplate;
return null;
}
}
Это возвращает существующую табличку с данными в зависимости от типа элемента. Надеюсь, я вас правильно понял, и это вам поможет.