【问题标题】:How to create a matrix of buttons如何创建按钮矩阵
【发布时间】:2012-09-17 18:17:52
【问题描述】:

我需要创建一个 10*10 的静态矩阵(需要是数据网格),每个单元格中都包含按钮。
任何人都知道如何做到这一点?

谢谢大家。

Xmal:

<Grid>
    <DataGrid ItemsSource="{Binding Arr}">  
        <DataGrid.ItemTemplate>  
            <DataTemplate>  
                <Button />  
            </DataTemplate>  
        </DataGrid.ItemTemplate>  
    </DataGrid>  
</Grid>  

代码:

namespace WpfApplication4  
{
    /// <summary>  
    /// Interaction logic for MainWindow.xaml  
    /// </summary>  
    public partial class MainWindow : Window  
    {  
       private List<string> m_Arr;  

        public MainWindow()  
        {  
             InitializeComponent();  
             DataContext = this;  

            m_Arr = new List<string>();  
            for (int i = 0; i < 10; i++)  
            {  
                m_Arr.Add(i.ToString());  
            }  
         }  

        public List<string> Arr  
        {
            get { return m_Arr; }  
            set { m_Arr = value; }  
        }  
    }  
}  

【问题讨论】:

  • 我试图在后面的代码中创建一个二维按钮数组,并将其绑定到数据网格,但它没有给我预期的结果,
  • 我试图创建一个 List> 并将其绑定到一个数据网格,这给了我一个 int 矩阵,但我没有成功将它更改为按钮而不是 int...
  • 结果的哪一部分出乎意料?不要使用矩阵标签 - 它用于数学矩阵和矩阵代数。
  • 而不是按钮我得到 toString (system.window.controls.buttons)
  • 您可能想要ItemsControl 而不是DataGrid,并将ItemTemplate 定义为Button。我有一些examples on my blog 应该有助于解释这个过程。一个非常简单的方法是将ItemsPanelTemplate更改为10x10的UniformGrid,并将所有项目放在一个List&lt;T&gt;中,或者您可以使用List&lt;List&lt;T&gt;&gt;并使用两个嵌套的ItemsControls,一个ItemsPanelTemplate 使用 Vertical StackPanel,另一个使用 Horizo​​ntal StackPanel

标签: c# wpf datagrid matrix


【解决方案1】:

您可能不想将按钮数组绑定到数据网格。

相反,您应该构建一个命令数组,将 itemscontrol 的 itemssource 绑定到命令列表,并将这些命令作为绑定回​​命令的按钮的数据模板。

【讨论】:

    【解决方案2】:

    您可以按照评论中的说明创建一个二维数组。但是,默认的 WPF DataGrid 不支持 2D ItemsSource

    例如,您可以使用此处介绍的DataGrid2D 控件:

    How to populate a WPF grid based on a 2-dimensional array

    我个人使用它并且...它工作正常!

    底部注释:不要创建 Buttons 的数组以用作 ItemsSource。例如,您应该执行以下操作:

    <DataGrid ItemsSource="{Binding MyList}">
      <DataGrid.ItemTemplate>
         <DataTemplate>
            <Button Content="{Binding}" />
         </DataTemplate>
      </DataGrid.ItemTemplate>
    </DataGrid>
    

    其中MyList 是IList&lt;string&gt;

    将其作为测试。然后你可以使用更复杂的ItemsSource,包括内容字符串+Command在点击按钮时调用。方式更干净,符合 MVVM =)

    【讨论】:

    • 糟糕,我犯了一个小错误,请给我一点时间来编辑这个^^
    • 已修复,ItemTemplate 必须首先包含 DataTemplate... 这就是我在没有 Visual Studio 帮助的情况下编写代码时发生的情况 =)
    • 您的代码错误。看看你的Button:你没有把任何东西作为内容!
    • 哦,您正在绑定一个 List (仅一维)。在这种情况下,您应该使用ListBox 而不是DataGrid
    • 如答案中所述,采用完全相同的想法,但不要使用DataGrid,而是使用您将在嵌入式链接中找到的DataGrid2D => 将其绑定到 2D数组并让魔法发生 =)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 2012-10-03
    • 2020-01-29
    • 1970-01-01
    • 2023-03-17
    • 2018-05-05
    相关资源
    最近更新 更多