【问题标题】:Setting text for new row placeholder为新行占位符设置文本
【发布时间】:2015-10-08 20:42:54
【问题描述】:

我有一个启用 CanUserAddRows 的简单数据网格:

<DataGrid Name="TestCasesDataGrid" Padding="0 0 5 0" AutoGenerateColumns="False" CanUserAddRows="True" CanUserDeleteRows="True" CanUserSortColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Width="100" Binding="{Binding Name}" />
    </DataGrid.Columns>
</DataGrid>

现在我想在新行占位符中有一个灰色的默认文本“新行...”,当我单击它时它会消失(添加新行)。
another question我找到了如下设置前景色的方法:

<DataGrid Name="TestCasesDataGrid" Padding="0 0 5 0" AutoGenerateColumns="False" CanUserAddRows="True" CanUserDeleteRows="True" CanUserSortColumns="False">
    <DataGrid.Resources>
        <Style TargetType="{x:Type DataGridRow}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding}" Value="{x:Static CollectionView.NewItemPlaceholder}">
                    <Setter Property="Foreground" Value="Gray" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTextColumn Width="100" Binding="{Binding Name}" />
    </DataGrid.Columns>
</DataGrid>

但我也找不到添加文本的方法。

【问题讨论】:

    标签: c# wpf xaml datagrid


    【解决方案1】:

    这是我找到的解决方案背后的代码(使用辅助方法在可视化树中查找子项):

    public static DependencyObject FindChild(DependencyObject parent, Func<DependencyObject, bool> predicate)
    {
        if (parent == null) return null;
    
        int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
        for (int i = 0; i < childrenCount; i++)
        {
            var child = VisualTreeHelper.GetChild(parent, i);
    
            if (predicate(child))
            {
                return child;
            }
            else
            {
                var foundChild = FindChild(child, predicate);
                if (foundChild != null)
                    return foundChild;
            }
        }
    
        return null;
    }
    

    在 DataGrid 变得可见并完全加载后进行以下调用:

    var dataGridRow = Tools.FindChild(testCasesDataGrid, x =>
    {
        var element = x as DataGridRow;
        if (element != null && element.Item == System.Windows.Data.CollectionView.NewItemPlaceholder)
            return true;
        else
            return false;
    }) as DataGridRow;
    var textBlock = Tools.FindChild(dataGridRow, x =>
    {
        return x is TextBlock;
    }) as TextBlock;
    textBlock.Text = "new row...";
    textBlock.Foreground = System.Windows.Media.Brushes.Gray;
    

    【讨论】:

      【解决方案2】:

      你试过了吗?

      <DataGrid Name="TestCasesDataGrid" Padding="0 0 5 0" AutoGenerateColumns="False" CanUserAddRows="True" CanUserDeleteRows="True" CanUserSortColumns="False">
          <DataGrid.Resources>
              <Style TargetType="{x:Type DataGridRow}">
                  <Style.Triggers>
                      <DataTrigger Binding="{Binding}" Value="{x:Static CollectionView.NewItemPlaceholder}">
                          <Setter Property="Foreground" Value="Gray" />
                          <Setter Property="TextBlock.Text" Value="New Row" />
                      </DataTrigger>
                  </Style.Triggers>
              </Style>
          </DataGrid.Resources>
          <DataGrid.Columns>
              <DataGridTextColumn Width="100" Binding="{Binding Name}" />
          </DataGrid.Columns>
      </DataGrid>
      

      【讨论】:

        猜你喜欢
        • 2017-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-16
        • 2021-11-30
        • 2011-08-15
        • 2015-02-27
        相关资源
        最近更新 更多