【问题标题】:ItemsControl with DataTemplate in code behind only displays one item后面代码中带有 DataTemplate 的 ItemsControl 只显示一项
【发布时间】:2019-09-02 20:07:30
【问题描述】:

我正在尝试从后面的代码创建一个DataTemplate,但在ItemsControl 中使用它,只显示一个项目...

如果我在 XAML 中描述 DataTemplate,我拥有所有项目。

我使用这里描述的代码来创建我的DataTemplate:https://stackoverflow.com/a/25428280/9725495

完整的 XAML:

<ItemsControl ItemsSource="{Binding Radios}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid Height="40">
                    <TextBlock Text="{Binding Name}" TextTrimming="CharacterEllipsis" Margin="6" HorizontalAlignment="Left" VerticalAlignment="Center" />
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

这是我的代码:

        var grid = new Grid();
        grid.Height = 40;

        var textblock = new TextBlock();
        textblock.SetBinding(TextBlock.TextProperty, "Name");
        textblock.Margin = new Thickness(6);
        textblock.TextTrimming = TextTrimming.CharacterEllipsis;
        textblock.HorizontalAlignment = HorizontalAlignment.Left;
        textblock.VerticalAlignment = VerticalAlignment.Center;

        grid.Children.Add(textblock);

        RadioDataTemplate = TemplateGenerator.CreateDataTemplate(() => grid);

  <ItemsControl ItemsSource="{Binding Radios}" ItemTemplate="{Binding RadioDataTemplate}" />

编辑:

SharedSizeGroup 的问题

RadioDataTemplate = TemplateGenerator.CreateDataTemplate(() =>
        {
            var grid = new Grid();
            grid.Height = 40;

            for (int i = 1; i <= 2; i++)
            {
                grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star) });

                if (i < 2)
                    grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Auto), SharedSizeGroup = "A" });
            }

            var image = new Image();
            image.SetBinding(Image.SourceProperty, "Image");
            image.Stretch = System.Windows.Media.Stretch.Uniform;
            RenderOptions.SetBitmapScalingMode(image, BitmapScalingMode.HighQuality);
            image.HorizontalAlignment = HorizontalAlignment.Center;
            image.VerticalAlignment = VerticalAlignment.Center;

            grid.Children.Add(image);
            Grid.SetColumn(image, 0);

            var gridsplitter = new GridSplitter();
            gridsplitter.HorizontalAlignment = HorizontalAlignment.Stretch;
            gridsplitter.Width = 5;
            gridsplitter.Background = new SolidColorBrush(Colors.Red);

            grid.Children.Add(gridsplitter);
            Grid.SetColumn(gridsplitter, 1);

            var textblock = new TextBlock();
            textblock.SetBinding(TextBlock.TextProperty, "Name");
            textblock.Margin = new Thickness(6);
            textblock.TextTrimming = TextTrimming.CharacterEllipsis;
            textblock.HorizontalAlignment = HorizontalAlignment.Left;
            textblock.VerticalAlignment = VerticalAlignment.Center;

            grid.Children.Add(textblock);
            Grid.SetColumn(textblock, 2);

            return grid;
        });

【问题讨论】:

    标签: c# wpf datatemplate itemscontrol


    【解决方案1】:

    目前还不清楚您为什么要这样做,至少在后面的代码中创建 DataTemplate 是完全不寻常的。总之,

    () => grid
    

    总是只返回您之前创建的同一个 Grid 实例。

    但是,您必须在每次调用中创建一个新的:

    RadioDataTemplate = TemplateGenerator.CreateDataTemplate(() =>
    {
        var grid = new Grid();
        grid.Height = 40;
    
        var textblock = new TextBlock();
        textblock.SetBinding(TextBlock.TextProperty, "Name");
        textblock.Margin = new Thickness(6);
        textblock.TextTrimming = TextTrimming.CharacterEllipsis;
        textblock.HorizontalAlignment = HorizontalAlignment.Left;
        textblock.VerticalAlignment = VerticalAlignment.Center;
    
        grid.Children.Add(textblock);
        return grid;
    });
    

    【讨论】:

    • 感谢您的解决方案!我需要动态创建数据模板。
    • 我对包含 SharedSizeGroup 的最终代码有一点问题。这不适用于您的解决方案。你觉得我忘记了什么?我编辑了我的问题。
    • 那个循环看起来很奇怪。是否应该生成三列*,Auto,*
    • 是的,这只是一个测试。 3 列(*、Auto、*)用于测试。
    • SharedSizeGroup 应该在 GridSplitter 的 Auto 列上?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 2011-07-25
    • 2011-09-14
    • 1970-01-01
    相关资源
    最近更新 更多