【问题标题】:Add and interact with button in WPF DataGrid在 WPF DataGrid 中添加按钮并与之交互
【发布时间】:2020-09-14 13:58:50
【问题描述】:

我想在 DataGrid 的每一行中添加一个按钮,该按钮应以编程方式禁用/重命名。

我发现,可以添加一个按钮来执行以下操作:

<DataGrid x:Name="dataGrid_newViews" ItemsSource="{Binding}" AutoGenerateColumns="True" CanUserAddRows="false" Grid.ColumnSpan="2">
    <DataGrid.Columns>
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button x:Name="btn_installSnippet" Click="btn_installSnippet_Click">Install</Button>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

当我尝试做类似的事情时

btn_installSnippet.Content = "abc";

我确实收到了错误消息,即当前上下文中不存在该名称...

谁能给我一个提示,我做错了什么?

【问题讨论】:

  • 由于每一行都有一个Button,您是要以编程方式禁用所有按钮还是只禁用其中的任何一个?
  • 软件会检查文件夹中是否有一些包含 XML sn-ps 的文件。这些都列在 DataGrid 中。每行中的每个按钮都应单独运行,具体取决于 sn-p 是否已包含在另一个大 XML 文件中。

标签: c# wpf datagrid


【解决方案1】:

XAML 中的 DataTemplate 定义:

<Window 
     ... 
     MouseDoubleClick="Window_MouseDoubleClick">

     <Grid>
            <Grid.Resources>
                <DataTemplate x:Key="ButtonTemplate" >
                    <Button x:Name="btn_installSnippet" Click="btn_installSnippet_Click">Install</Button>
                </DataTemplate>
            </Grid.Resources>
            <DataGrid x:Name="dataGrid_newViews" ItemsSource="{Binding}" AutoGenerateColumns="True" CanUserAddRows="True" Grid.ColumnSpan="2">
                <DataGrid.Columns>
                    <DataGridTemplateColumn Header="Button" CellTemplate="{StaticResource ButtonTemplate}" />
                </DataGrid.Columns>
            </DataGrid>
     </Grid>
</Window>

在后面的代码中添加新行:

private void Window_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    dataGrid_newViews.Items.Add("a new item");         
}

注意:System.Windows.Media.VisualTreeHelper 可能用于 迭代 DataGrid 中的所有元素以找出所需的控件。

【讨论】:

    【解决方案2】:

    为了获得最大的控制,您可以在后面的代码中执行所有操作:

    DataGridTemplateColumn column = new DataGridTemplateColumn();
    column.Header = "NewColumn";
    FrameworkElementFactory factory = new FrameworkElementFactory(typeof(Button));
    string content = "MyContent";
    factory.SetValue(Button.ContentProperty, content);
    DataTemplate cellTemplate = new DataTemplate();
    cellTemplate.VisualTree = factory;
    column.CellTemplate = cellTemplate;
    dg1.Columns.Add(column);
    

    您可以在此处查看更多详细信息:What is the code behind for datagridtemplatecolumn, and how to use it?

    【讨论】:

    • 这并没有提供更多的控制,但更复杂。 FrameworkElementfactory:这个类是一种以编程方式创建模板的弃用方式(参见文档中的备注)。
    猜你喜欢
    • 2019-03-20
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 2014-10-18
    相关资源
    最近更新 更多