c# wpf的datagrid列标题间的分割线,我加background后变成一大块黑色的,怎么变成间隔的一块一块的,如图
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# wpf的datagrid列标题间的分割线,我加background后变成一大块黑色的,怎么变成间隔的一块一块的,如图相关的知识,希望对你有一定的参考价值。
我实现的是左边,如何实现右边那样,需要什么属性或者style
把上面的datagrid变成下面这种形式,要如何办到
右边的属性列间有一小段空格
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 事件。这里的交易,数据网格的工作方式是它创建一个数据视图并显示它而不是原始数据,因此当您只是在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后变成一大块黑色的,怎么变成间隔的一块一块的,如图的主要内容,如果未能解决你的问题,请参考以下文章
c# wpf datagrid 模板列修改某个单元格,更新所选行另一个单元格的值,如何做到呢?