c# wpf的datagrid列标题间的分割线,我加background后变成一大块黑色的,怎么变成间隔的一块一块的,如图

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# wpf的datagrid列标题间的分割线,我加background后变成一大块黑色的,怎么变成间隔的一块一块的,如图相关的知识,希望对你有一定的参考价值。

我实现的是左边,如何实现右边那样,需要什么属性或者style
把上面的datagrid变成下面这种形式,要如何办到

参考技术A 什么左边右边?不是一样的吗追问

右边的属性列间有一小段空格

wpf 4.0 datagrid模板列双向绑定问题

【中文标题】wpf 4.0 datagrid模板列双向绑定问题【英文标题】:wpf 4.0 datagrid template column two-way binding problem 【发布时间】:2011-02-25 03:45:06 【问题描述】:

我正在使用 wpf 4.0 中的数据网格。这有一个包含复选框的 TemplateColumn。复选框的 IsChecked 属性是通过绑定设置的。

问题是,即使我将绑定模式明确指定为 TwoWay,它也只能在一个方向上工作。

我不得不提到,相同的代码在 .net 3.5 中与 wpf 工具包中的数据网格完美配合。

请查看 .xaml 和 .cs 内容。

提前致谢,

罗兰

<Window.Resources>
    <DataTemplate
        x:Key="IsSelectedColumnTemplate">
        <CheckBox
            IsChecked="Binding Path=IsSelected, Mode=TwoWay"
            />
    </DataTemplate>
</Window.Resources>
<Grid>
    <DataGrid
        x:Name="dataGrid"
        AutoGenerateColumns="false"
        CanUserAddRows="False"
        CanUserDeleteRows="False"
        HeadersVisibility="Column"
        ItemsSource="Binding"
        >
        <DataGrid.Columns>
            <DataGridTemplateColumn 
                Header="Preselected"
                x:Name="myIsSelectedColumn" 
                CellTemplate="StaticResource IsSelectedColumnTemplate"
                CanUserSort="True"
                SortMemberPath="Orientation"
                Width="Auto"
                />
        </DataGrid.Columns>
    </DataGrid>
</Grid>

以及相关的.cs内容:

public partial class MainWindow : Window

    public MainWindow()
    
        InitializeComponent();

        ObservableCollection<DataObject> DataSource = new ObservableCollection<DataObject>();
        DataSource.Add(new DataObject());    
        DataSource.Add(new DataObject());          
        dataGrid.ItemsSource = DataSource;
    


public class DataObject : DependencyObject

    public bool IsSelected
    
        get  return (bool)GetValue(IsSelectedProperty); 
        set  SetValue(IsSelectedProperty, value); 
    

    // Using a DependencyProperty as the backing store for IsSelected.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty IsSelectedProperty =
        DependencyProperty.Register("IsSelected", typeof(bool), typeof(DataObject), new UIPropertyMetadata(false, OnIsSelectedChanged));

    private static void OnIsSelectedChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
    
        // this part is not reached
    

【问题讨论】:

【参考方案1】:

您在数据模板的 Checkbox IsChecked 绑定中设置了 UpdateSourceTrigger=PropertyChanged: <CheckBox IsChecked="Binding Path=IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged" />

【讨论】:

这很好用,但没有按预期工作。当您键入一个字母时,它会立即更改对象。如果您有一个触发验证处理程序的触发器会发生什么。这意味着如果您输入 1000 个符号,它会触发 1000 次?这是不对的。 这可能是一个可接受的解决方案,跟踪 LostFocus 事件。 @Dilshod 如果一个类型输入 1000 个符号,它会触发 1000 次是什么意思?我们说的是复选框,对吧? @Sese 在这种情况下,您使用 CheckBox 很好,但如果您使用 TextBox 并绑定到属性,它会在每次按键时触发 PropertyChanged 事件。【参考方案2】:

这里的交易,数据网格的工作方式是它创建一个数据视图并显示它而不是原始数据,因此当您只是在CellTemplate 中绑定一个属性时,它不会从查看数据。

您需要做的是使用CellEditingTemplate,以便数据网格知道您何时正在编辑,并可以在完成时将其传播到数据(或者如果您取消它可以撤消它)。

这是修改后的 XAML:

<Window.Resources>
    <DataTemplate x:Key="IsSelectedColumnTemplate">
        <TextBlock Text="Binding IsSelected"/>
    </DataTemplate>
    <DataTemplate x:Key="IsSelectedColumnTemplateEditing">
        <CheckBox IsChecked="Binding Path=IsSelected, Mode=TwoWay"/>
    </DataTemplate>
</Window.Resources>

...
<DataGridTemplateColumn 
    Header="Preselected"
    x:Name="myIsSelectedColumn" 
    CellTemplate="StaticResource IsSelectedColumnTemplate"
    CellEditingTemplate="StaticResource IsSelectedColumnTemplateEditing"
    CanUserSort="True"
    Width="Auto"
/>
...

【讨论】:

我认为这不是真的。如果没有使用 Sese 的答案的 CellEditingTemplate,它对我来说非常适合。 CellEditingTemplate 看起来会使事情变得过于复杂,并使用户更难使用。点击复选框肯定需要多次点击。

以上是关于c# wpf的datagrid列标题间的分割线,我加background后变成一大块黑色的,怎么变成间隔的一块一块的,如图的主要内容,如果未能解决你的问题,请参考以下文章

WPF,DataGrid怎么设置列标题分割线的颜色

删除 WPF DataGrid 中的空白列

c# wpf datagrid 模板列修改某个单元格,更新所选行另一个单元格的值,如何做到呢?

c# wpf datagrid中选择所有复选框的代码

C# WPF datagrid checkboxcolumn 使用问题

用字典 <String,MyClass> 在 C# 中填充 WPF DataGrid