Я пишу программу, которая может генерировать анкеты. Под последним вопросом вы можете добавить новый вопрос. Тип этого вы определяете заранее. (подумайте о радио, флажке или открытии + многое другое). После нажатия кнопки «Добавить» создается модель представления (производная от IQuestionVM), которая помещается в коллекцию ObservableCollection (QuestionViewModels).

В представление должно быть добавлено отдельное представление для каждого типа вопроса. В сетке есть привязка ко всем QuestionViewModels. Для каждого нового вопроса в сетку добавляется новая строка. Однако в сетку загружается не правильный вид, а стандартный QuestionRadioView. У каждой QuestionViewModel есть тип, указывающий на тип вопроса.

<Window.Resources>
    <DataTemplate x:Key="QuestionOpen" DataType="{x:Type viewModel:QuestionOpenViewModel}">
        <local:QuestionOpenView></local:QuestionOpenView>
    </DataTemplate>
    <DataTemplate x:Key="QuestionRadio" DataType="{x:Type viewModel:QuestionRadioViewModel}">
        <local:QuestionRadioView></local:QuestionRadioView>
    </DataTemplate>
</Window.Resources>

И код для сетки.

<DataGrid ItemsSource="{Binding QuestionViewModels}">
<DataGrid.Columns>
    <DataGridTemplateColumn>
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <ContentControl Name="view"
                                Content="{Binding}"
                                ContentTemplate="{StaticResource QuestionRadio}" 
                                />
                <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding Path=QuestionViewModels[1].Type}" Value="Radio">
                        <Setter TargetName="view" 
                                Property="ContentTemplate"
                                Value="{StaticResource QuestionRadio}" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Path=QuestionViewModels[1].Type}" Value="Open">
                        <Setter TargetName="view" 
                                Property="ContentTemplate"
                                Value="{StaticResource QuestionOpen}" />
                    </DataTrigger>
                </DataTemplate.Triggers>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
</DataGrid.Columns>

Что я делаю не так?

0
William 16 Ноя 2019 в 20:35
1
Используйте DataTemplateSelector. вместо.
 – 
Eldar
16 Ноя 2019 в 20:44

1 ответ

Лучший ответ

Как предлагается в комментарии, это хорошо подходит для селектора DataTemplate.

Просто добавьте класс TemplateSelector с необходимыми свойствами DataTemplates:

public class MyDataTemplateSelector : DataTemplateSelector
{
    public DataTemplate QuestionOpenTemplate { get; set; }
    public DataTemplate QuestionRadioTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item is QuestionOpenViewModel)
            return QuestionOpenTemplate;
        if (item is QuestionRadioViewModel)
            return QuestionRadioTemplate;
        return base.SelectTemplate(item, container);
    }
}

Затем обновите свой XAML, чтобы вместо него использовать ContentTemplateSelector:

 <Window.Resources>
    <DataTemplate x:Key="QuestionOpenTemplate" >
        <CheckBox/>
    </DataTemplate>
    <DataTemplate x:Key="QuestionRadioTemplate" >
        <RadioButton/>
    </DataTemplate>
    <yrNameSpace:MyDataTemplateSelector x:Key="MyDataTemplateSelector"
                                    QuestionOpenTemplate="{StaticResource QuestionOpenTemplate}"
                                    QuestionRadioTemplate="{StaticResource QuestionRadioTemplate}"/>
</Window.Resources>
<Grid>
    <DataGrid ItemsSource="{Binding QuestionViewModels}" >
        <DataGrid.Columns>
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ContentControl Content="{Binding}"  Name="view" ContentTemplateSelector="{StaticResource MyDataTemplateSelector}"

                        />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
0
SamTh3D3v 18 Ноя 2019 в 14:41