如何仅为空ItemsSource在DataGrid中显示空的只读行?

时间:2016-12-22 18:24:21

标签: c# wpf binding datagrid

我在我的类KDataGrid中覆盖了DataGrid(为了我们的目的需要一些功能)。

public class KDataGrid : System.Windows.Controls.DataGrid { *** }

它可以与任何RecordType(泛型类型)的任何集合一起使用。

使用简单KDataGrid的示例XAML:

<components:KDataGrid
    CanUserAddRows="False"
    IsReadOnly="True"
    ItemsSource="{Binding Path=SomeCollection}">
    <DataGrid.Columns>
        <DataGridTextColumn
            Header="ID"
            Binding="{Binding Id}"
            Width="50"/>
        <DataGridTextColumn
            Header="Code"
            Binding="{Binding Code}"
            Width="130"/>
    </DataGrid.Columns>
</components:KDataGrid>

ViewModel包含:

public class SomeRecord: BaseRecord
    {
        public long ID { get; set; }
        public string Code { get; set; }
    }

public List<SomeRecord> SomeCollection { get; }

KDataGrid(DataGrid)是只读的。因为DataGrid底部的标准空行没有显示 如果集合 SomeCollection 为空,则无法将焦点设置在DataGrid上(例如,添加新记录)。

最简单的解决方法(我认为)是:显示空行(可以调焦) 但是,如果集合包含至少一行不需要显示空行。

有什么想法我该怎么做?

2 个答案:

答案 0 :(得分:0)

  

有什么想法我该怎么做?

如果要在DataGrid中显示空行,可以添加&#34;空&#34; &#39; SomeRecord&#39;反对你的&#39; SomeCollection&#39;在您的视图模型中:

SomeCollection.Add(new SomeRecord());

另一个选项是使用一个Style,它将DataGrid的ItemsSource属性设置为仅在SomeCollection源属性为空时包含空项的CompositeCollection:

<DataGrid CanUserAddRows="False" IsReadOnly="True" AutoGenerateColumns="False">
    <DataGrid.Style>
        <Style TargetType="DataGrid">
            <Setter Property="ItemsSource" Value="{Binding SomeCollection}" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding SomeCollection.Count}" Value="0">
                    <Setter Property="ItemsSource">
                        <Setter.Value>
                            <CompositeCollection>
                                <local:SomeRecord />
                            </CompositeCollection>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.Style>
    <DataGrid.Columns>
        <DataGridTextColumn Header="ID" Binding="{Binding ID}" Width="50"/>
        <DataGridTextColumn Header="Code" Binding="{Binding Code}" Width="130"/>
    </DataGrid.Columns>
</DataGrid>

在这两种情况下,您可能想要将ID属性的类型从long更改为long?为了使ID列为空,而不是显示0,这是长的默认值。

答案 1 :(得分:0)

问题解决方案很简单。 Thiere无需添加空记录。 只需点击ScrollViewer即可获得焦点:

public class KDataGrid : System.Windows.Controls.DataGrid
{
    public KDataGrid()
    {
        Loaded += OnLoaded;
    }

    private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
    {
        var scroll = FindVisualChild<ScrollViewer>();
        if (scroll != null)
        {
            scroll.MouseDown += (o, args) =>
            {
                if (IsKeyboardFocusWithin)
                    return;

                Focus();
            };
        }
    }

    public static T FindVisualChild<T>(this DependencyObject root) where T : DependencyObject
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(root); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(root, i);
            if (child != null && child is T)
                return (T)child;
            else
            {
                T childOfChild = child.FindVisualChild<T>();
                if (childOfChild != null)
                    return childOfChild;
            }
        }
        return null;
    }
}