我在我的类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上(例如,添加新记录)。
最简单的解决方法(我认为)是:显示空行(可以调焦) 但是,如果集合包含至少一行不需要显示空行。
有什么想法我该怎么做?
答案 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;
}
}