在wpf设计的界面中,我通过DataGrid建立列表,我想通过点击列表头进行排序。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在wpf设计的界面中,我通过DataGrid建立列表,我想通过点击列表头进行排序。相关的知识,希望对你有一定的参考价值。

可是这个DataGrid已经自带的有排序功能 ,这个排序功能只能排列当前页。我要的功能是给服务器发数据然后进行整个的排序。解决方法是:我想要在每一个列头地方写一个

触发事件,你只需要告诉我怎么在wpf上面添加就可以了。
<DataGrid>
<DataGrid.Columns>
<DataGridTextColumn Header="设备编号" Width="100" Binding="Binding SN" />
<DataGridTextColumn Header="识别码" Width="100" Binding="Binding Code" />
</DataGrid.Columns>
</<DataGrid>>

设备编号是我的列头,我就是点击他们触发事件的

参考技术A             <DataGrid  Name="dg" 
                       Sorting="dg_Sorting"/>

        private void dg_Sorting(object sender, DataGridSortingEventArgs e)
        
            MessageBox.Show(e.Column.Header.ToString());
        

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 看起来会使事情变得过于复杂,并使用户更难使用。点击复选框肯定需要多次点击。

以上是关于在wpf设计的界面中,我通过DataGrid建立列表,我想通过点击列表头进行排序。的主要内容,如果未能解决你的问题,请参考以下文章

WPF4 Datagrid 不对列标题进行排序

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

wpf 通过为DataGrid所绑定的数据源类型的属性设置Attribute改变DataGrid自动生成列的顺序

WPF DataGrid 通过自定义表头模拟首行固定

WPF DataGrid点击列头选择全列并具有背景色

wpf DataGrid 里的列模版的值绑定