【问题标题】:Buttons list bind to Grid into UserControl (WPF, Linq, Buttons)按钮列表绑定到 Grid 到 UserControl(WPF、Linq、Buttons)
【发布时间】:2017-04-26 11:53:25
【问题描述】:

我正在做基于 Linq 查询的按钮列表。

用户控件.cs

 public partial class GenerateButtonView : UserControl
 {    
    public GenerateButtonView()
    {
       InitializeComponent();

       List<Button> listOfButtons = new List<Button>();
       for (int x = 0; x <= gb.ListDistinctAutoName().Count; x++)
       {
          Button b = new Button();
          b.Content = "button" + x.ToString();
          listOfButtons.Add(b);               
       }
     }}

GenerateButtonModel.cs

public class GenerateButtonModel
{
   public List<string> ListDistinctAutoName()
   {
      testViewClassDataContext tv = new testViewClassDataContext();
      List<string> q3 = tv.test_views.Select(i => i.AutoName).Distinct().ToList();               

       return q3;
   }}

如何将按钮的创建列表绑定到我的网格?

用户控件.xaml

<UserControl.....>
....
        <Grid Grid.Column="1" Grid.Row="3" Grid.ColumnSpan="5" Grid.RowSpan="3">

        </Grid>  

</UserControl>

【问题讨论】:

  • Grid 没有 ItemsSource 属性,您可以将其集合到其中。为什么要将按钮添加到网格?您如何定义按钮将位于哪个单元格中?
  • 我可以将按钮添加到 stackpanel 或 dockpanel,但我不知道如何......
  • 您应该使用 ItemsControl。看我的回答。

标签: c# wpf linq xaml data-binding


【解决方案1】:

您应该使用ItemsControl 并将其ItemsSource 属性绑定或设置为List&lt;Button&gt;

<ItemsControl x:Name="ic" />

public GenerateButtonView()
{
    InitializeComponent();

    List<Button> listOfButtons = new List<Button>();
    for (int x = 0; x <= gb.ListDistinctAutoName().Count; x++)
    {
        Button b = new Button();
        b.Content = "button" + x.ToString();
        listOfButtons.Add(b);
    }

    ic.ItemsSource = listOfButtons;
}}

我的想法是按钮应该水平放置,它们之间有边距

然后您可以例如使用StackPanel 作为ItemsControlItemsPanel

<ItemsControl x:Name="ic">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

您设置每个按钮的Margin 属性。

请注意,最佳做法是将 ItemsSource 属性绑定到数据对象的集合,然后在 ItemTemplate 中定义实际的 UI 元素 (Button):

<ItemsControl x:Name="ic">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button Content="{Binding}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

【讨论】:

  • 谢谢@mm8!一个问题 -> 例如,如果我要创建 DockPanel,以同样的方式绑定按钮?
  • 不,DockPanel 没有任何 ItemsSource 属性。那里也是一样,你打算如何定义按钮的停靠位置?
  • 我的想法是按钮应该水平放置,它们之间有边距
  • 如果确实需要使用面板,则需要手动添加按钮。没有办法绑定面板的孩子
【解决方案2】:

您需要手动将按钮添加到网格中

for (int x = 0; x <= gb.ListDistinctAutoName().Count; x++)
{
    Button b = new Button();
    b.Content = "button" + x.ToString();
    listOfButtons.Add(b);
    grid.Children.Add(b);
}

或使用ItemsControl 并将按钮列表设置为ItemsSource

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    相关资源
    最近更新 更多