WPF 数据模板选择器不工作

WPF DataTemplate Selector is not working

我正在开发 Treeview 控件。项目控件应根据数据结构的值动态显示一组文本框和组合框。 执行 ArgumentTypeTemplateSelector 的转换代码。但是,没有显示文本框和组合。请好心人帮忙。谢谢。

树视图(xaml)

                  <ItemsControl x:Name="argumentTexts" ItemsSource="{Binding ArgumentDetailsCollection}">
                        <ItemsControl.ItemsPanel>
                            <ItemsPanelTemplate>
                                <StackPanel HorizontalAlignment="Stretch" IsItemsHost="True" Orientation="Horizontal"/>
                            </ItemsPanelTemplate>
                        </ItemsControl.ItemsPanel>
                        <ItemsControl.ItemTemplate>
                            <DataTemplate DataType="{x:Type structures:ArgumentDetails}">
                                <ItemsControl x:Name="items" ItemsSource="{Binding DefaultValue}" 
                                              ItemTemplateSelector="{Binding DefaultValue, Converter={StaticResource ArgTypeTemplateSelector}}"/>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>


public class ArgumentTypeTemplateSelector : IValueConverter
{
    private DataTemplate comboboxDataTemplate;

    private DataTemplate textboxDataTemplate;

    public DataTemplate ComboBoxDataTemplate
    {
        get
        {
            return this.comboboxDataTemplate;
        }

        set
        {
            this.comboboxDataTemplate = value;
        }
    }

    public DataTemplate TextBoxDataTemplate
    {
        get
        {
            return this.textboxDataTemplate;
        }

        set
        {
            this.textboxDataTemplate = value;
        }
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string str = (string)value;

        if (str.Contains("1"))
        {
            return this.ComboBoxDataTemplate;
        }

        return this.TextBoxDataTemplate;
    }

在资源词典中(xaml)

        <DataTemplate x:Key="TextBoxDataTemplate">
            <TextBox Text="{Binding DefaultValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                                         VerticalAlignment="Center" 
                                         Width="Auto" 
                                         Margin="5,0,0,0"
                                         Padding="0" 
                                         Style="{StaticResource GridEditStyle}"
                                         IsEnabled="True"/>
        </DataTemplate>
        <DataTemplate x:Key="ComboBoxDataTemplate">
            <ComboBox HorizontalAlignment="Stretch" IsEnabled="True"/> 
        </DataTemplate>
        <columnConfiguratorControls:ArgumentTypeTemplateSelector x:Key="ArgTypeTemplateSelector" ComboBoxDataTemplate="{StaticResource ComboBoxDataTemplate}" TextBoxDataTemplate="{StaticResource TextBoxDataTemplate}"/>
    </ResourceDictionary>

DataTemplateSelectors 的工作方式与转换器不同。您的 DataTemplateSelector 将检索您的列表项作为参数,并且根据您定义的条件,您可以选择应返回的 DataTemplate。

尝试以下操作: 在您的 xaml 文件中将您的 DataTemplateSelector 定义为静态资源并将其设置在您的 ItemsControl 中:

<ItemsControl x:Name="argumentTexts" ItemsSource="{Binding ArgumentDetailsCollection}">
        <ItemsControl.Resources>
            <!-- define your template selector as static resource to reference it later -->
            <ns:ArgumentTypeTemplateSelector x:Key="ArgumentTypeTemplateSelector"/>
        </ItemsControl.Resources>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel HorizontalAlignment="Stretch" IsItemsHost="True" Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate DataType="{x:Type structures:ArgumentDetails}">
                <!-- use your template selector here -->
                <ItemsControl x:Name="items" ItemsSource="{Binding DefaultValue}" 
                              ItemTemplateSelector="{StaticResource ArgumentTypeTemplateSelector }"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

在您的代码隐藏文件中,您需要通过以下方式实施您的数据模板选择器:

// derive from base class DataTemplateSelector
public class ArgumentTypeTemplateSelector : DataTemplateSelector
{
    // override SelectTemplate method
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        // get access to the resources you need, for example
        // by accessing the UI object where your selector is placed in
        var frameworkElement = (FrameworkElement) container;

        // return a data template depending on your custom logic,
        // you can cast "item" here to the specific type and check your conditions
        if(item has condition)
        return (DataTemplate) frameworkElement.FindResource("YourDataTemplateKey");
        else
            // ...
        return base.SelectTemplate(item, container);
    }
}