【问题标题】:Windows Wpf how can I dynamically create xaml grid using c#Windows Wpf如何使用c#动态创建xaml网格
【发布时间】:2020-01-13 14:35:17
【问题描述】:

使用 Visual Studio 2019 + Resharper。

大家好,我想添加列表视图,它显示对象中的内容,我从列表中获取。 它看起来像这样,当我手动编码时:

XAML 代码:

 <ListView Margin="43,313,642,29" BorderThickness="2" BorderBrush="Red" x:Name="Module1">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <WrapPanel>
                        <TextBlock Text="Modul"/>
                        <TextBlock Text="{Binding Name}" FontWeight="Bold"/>
                    </WrapPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

和c#代码:

            List<Module> somename = pPP_2.Components.Modules.Values.Cast<Module>().ToList();

            List<Module> whatevername = new List<Module>(){somename[0]};

            Module1.ItemsSource = whatevername;

我提到的模块有几个属性,{somename[0]} 只是获取其中的第一个并将其放入列表中。

所以基本上我的问题: 如何使用 c# 创建这样的 xaml 代码?我想为列表中的每个元素创建一个这样的列表视图。我不想手动创建它们,而是让代码为我完成。

想了好几天了,很想在这里得到一些帮助。

谢谢, IRezzet。

附:你基本上可以忽略我在那里创建的特殊列表。这个问题应该适用于每个列表。

【问题讨论】:

  • 为什么不为项目源创建一个包含 ListView 和(依赖)属性的用户控件?您只需使用新的 List 列表作为参数添加控件的新实例?
  • 您的代码不会为您执行此操作,因为您需要创建它!另外,查看您已经在使用的DataTemplates,这些实际上将用于您的项目列表等...使用 xaml 比使用代码容易得多。

标签: c# wpf xaml listview foreach


【解决方案1】:

您可以将ItemsControlItemTemplate 一起使用,该ListView 具有ItemTemplate 呈现列表视图项。如果这变得太复杂,请考虑将其分离到用户控件中以使其更通用。

XAML 看起来像这样:

    <ItemsControl x:Name="DynamicGrid">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <ListView BorderThickness="2" ItemsSource="{Binding SubChildren}" BorderBrush="Red">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Name}" FontWeight="Bold"/>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

为此,您需要两种模型类型

    // And an instance variable
    public ObservableCollection<Outer> Lists { get; } = new ObservableCollection<Outer>();
    public class Outer
    {
        public ObservableCollection<Inner> SubChildren { get; } = new ObservableCollection<Inner>();
    }
    public class Inner
    {
        public string Name { get; set; }
    }

我使用此代码作为种子进行测试:

        for (int i = 0; i < 10; i++)
        {
            var o = new Outer();
            for (int k = 0; k < 10; k++)
            {
                o.SubChildren.Add(new Inner() { Name = "ID: "+k });
            }
            Lists.Add(o);
        }
        DynamicGrid.ItemsSource = Lists;

【讨论】:

    【解决方案2】:

    真的不行。。 问题是我知道如何从我的列表或对象或其他内容中显示内容,但我想动态创建与列表中的对象一样多的列表视图。表示当对象数量发生变化时它会发生变化。没有办法吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多