【问题标题】:Dynamically create rows and columns动态创建行和列
【发布时间】:2012-04-17 21:23:47
【问题描述】:

对不起,如果这是一个菜鸟问题。我刚开始学习WPF,所以希望你们不要介意。但是,是否可以通过 xaml 为每行动态创建两列,还是必须在后端代码(viewmodel、.cs)中完成?现在,通过与数据源绑定,我只有一长串项目。例如,datasource = "{binding path=House.Item}" ... Item 是一个集合,它在执行存储过程调用时存储标签和值。例如:label="Color", value="White"。

我目前有:

颜色

白色

窗口

乙烯基

我希望结果为每行 2 列(无法正确显示):

颜色 | >>> 窗口

白色 | >>> 文利

门 | >>> 地下室

木材 | >>> 完成

我想要实现这一点的原因是我可以消除水平滚动,以防万一项目变得很长。任何意见将是有益的。非常感谢。

更新:

<ListBox.Resources>                                 
<DataTemplate DataType="{x:Type Models:HouseDetail}" >                                               
<Views:HouseView>           
</DataTemplate>
<ListBox.Resources>

这几乎就是我的数据的生成方式,这又给了我一个类似“从上到下”的流程,而我希望它显示“从左到右”。 例如:1 2 3

1

2

3

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    如果想要显示一个列表,那么你应该查看一个 Listbox 控件。对于列表中的每个项目,您可以使用 ItemTemplate 描述您希望如何布置项目。有关使用 ItemTemplates 的更多信息,请参阅ItemTemplate documentation

    有一个对象代表您的列表项(例如 House 类)。创建列表项的 ObservableCollection 并将列表框绑定到 ObservableCollection。然后,在 XAML 中,描述每个 House 项目的布局以及您希望它的外观。这样的事情应该可以工作:

    代码

    public class House 
    {
         public string Color { get; set; }
         public string Material { get;set; }
         public string Window { get; set; }
    }
    
    
    public class ViewModel
    {
        public ObservableCollection<House> Houses { get; set; }
    }
    

    XAML:

      <!-- DataContext should be set to an instance of ViewModel -->
     <ListBox ItemsSource="{Binding Houses}">
         <ListBox.ItemTemplate>
             <DataTemplate>
                 <StackPanel>
                     <!-- I am just using StackPanels here, but you can use any layout control you want to describe how you want each list item to look --> 
                     <StackPanel Orientation=Horizontal>
                         <TextBlock Text="House Color:"/>
                         <TextBlock Text="{Binding Path=Color}"/>
                     </StackPanel>
                     <StackPanel Orientation=Horizontal>
                         <TextBlock Text="House Material:"/>
                         <TextBlock Text="{Binding Path=Material}"/>
                     </StackPanel>
                     <!-- Add more controls to show more information -->
                 </StackPanel>
             </DataTemplate>
         </ListBox.ItemTemplate>
     </ListBox>
    

    抱歉,我手边没有编译器,所以我不确定这是否会编译,但应该很接近。

    【讨论】:

      【解决方案2】:

      我不确定我是否正确理解了这个问题,但我认为 stackpanel 可能是您正在寻找的。​​p>

      在控件的每一行中,您都可以有一个包含 2 个文本块的堆栈面板。然后你可以直接将每个值绑定到文本块。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-14
        • 2013-05-06
        • 2017-09-18
        • 2012-04-06
        • 1970-01-01
        • 2017-09-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多