我有一个使用多种组样式的数据网格。除了一个问题外,这种方法效果非常好。
列标题偏离了数据列,因为我在组样式中使用了扩展器和其他项容器。
我使用以下代码解决了这个问题:
public class Test {
private InputData inputdata;
private ClassUnderTest classUnderTest;
final List<ItemData> allData = new ArrayList<ItemData>();
@Mock
private DeliveryItemData item1;
@Mock
private DeliveryItemData item2;
@Mock
private SomeService myService;
@Before
public void setUp() throws Exception {
classUnderTest = new ClassUnderTest();
myService = mock(myService.class);
classUnderTest.setService(myService);
item1 = mock(DeliveryItemData.class);
item2 = mock(DeliveryItemData.class);
}
@Test
public void test_sort() {
createData();
when(myService.getListWithData(inputdata).get().getItemDatas());
when(item1.hasSomething()).thenReturn(true);
when(item2.hasSomething()).thenReturn(false);
}
public void createData() {
item1.setSomeValue("val");
item2.setSomeOtherValue("test");
item2.setSomeValue("val");
item2.setSomeOtherValue("value");
allData.add(item1);
allData.add(item2);
}
这非常有效,但我知道有一个小但同样令人恼火的问题,即列标题偏移,在最左边的标题区域留下一个小区域,背景显示
如何扩展最左侧的列标题以覆盖此空间?
在类似的情况下,当滚动条出现时,滚动条上有一个类似的间隙,我认为这可能是一个类似的问题
答案 0 :(得分:0)
我将其设置为绿色以使其可见
<Style x:Key="DataGridRowHeaderStyle1" TargetType="{x:Type DataGridRowHeader}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridRowHeader}">
<!-- I set Width to 50 to make border visible. Set Width="0" to make it disappear -->
<Border BorderThickness="1" BorderBrush="Green" Width="50" >
这里使用DataGridRowHeaderStyle1:
<DataGrid x:Name="datagridPersons"
RowHeaderStyle="{DynamicResource DataGridRowHeaderStyle1}" >
(注意:要创建DataGridRowHeaderStyle:右键单击datagrid /编辑其他模板/编辑DataGridRowHeaderStyle /创建副本)
要使保证金消失,
将宽度设置为0,如上面的XAML注释所示,边距消失
使用Visual Studio查看可视树,您会看到:
这是有罪的!
(为了看到这一点,在图形回调中设置断点,观察this
或对数据网格的引用。
然后在调试器中单击放大镜
我找到的唯一解决方案是在可视化树中搜索有罪的ItemsPresenter
并将其边距设置为0
最后一个问题是GroupItems
是使用项目演示者动态创建的。
因此,添加GroupItems
时需要删除边距。
所以我订阅了CollectionViewSource
分组事件
viewSource.View.GroupDescriptions.CollectionChanged += View_CollectionChanged;
async void View_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
// later ...
await Task.Delay(100);
RemoveMargins();
}
private void RemoveMargins()
{
// For FindAllVisualDescendants() function, see my answer to that question :
// http://stackoverflow.com/questions/32736265/datagrid-templatecolumn-update-source-trigger-explicit-only-updates-first-row/32741477#32741477
var allItemsPresenter = datagridPersons.FindAllVisualDescendants()
.OfType<ItemsPresenter>()
.Where(elt => elt.Name == "ItemsPresenter")
.Where(elt => elt.Margin == new Thickness(5, 0, 0, 0));
foreach (var itemsPresenter in allItemsPresenter)
{
itemsPresenter.Margin = new Thickness(0, 0, 0, 0);
}
}
我必须让它异步。
这样,它起作用:
以下是完整代码:
最佳编码