首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用XAML在WPF中对DataGridColumn.SortDirection进行数据库?

如何使用XAML在WPF中对DataGridColumn.SortDirection进行数据库?
EN

Stack Overflow用户
提问于 2022-02-14 16:47:59
回答 1查看 97关注 0票数 0

这与代码中的DataGrid列标题数据库相关,但它提出了相反的问题:“我如何在XAML中完成它?”,而不是“我如何在代码中完成它?”

我构造了这个MainWindow.xaml

代码语言:javascript
复制
<Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="450" Width="800"
        DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <Grid>
        <DataGrid AutoGenerateColumns="False" CanUserSortColumns="True" Sorting="DataGrid_Sorting" Margin="5" ItemsSource="{Binding ItemsSource}">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Value}" SortDirection="{Binding SortDirection, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Mode=TwoWay}" Header="Click Me" x:Name="column"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

而这个MainWindow.xaml.cs

代码语言:javascript
复制
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows;

public partial class MainWindow : Window
{
    private ListSortDirection? _sortDirection;
    public ListSortDirection? SortDirection
    {
        get => _sortDirection;
        set
        {
            // I expect this message box to appear, but it doesn't.
            MessageBox.Show($"Setting sort direction to {value?.ToString() ?? "null"}");
            _sortDirection = value;
        }
    }

    public IEnumerable<object> ItemsSource { get; } = new[] { 1, 2, 3, 4, 5 }.Select(x => new { Value = x }).ToList();

    public MainWindow() => InitializeComponent();

    private void DataGrid_Sorting(object sender, System.Windows.Controls.DataGridSortingEventArgs e)
        => MessageBox.Show($"Sorting grid.\nColumn sort direction was {column.SortDirection?.ToString() ?? "null"}.");
}

绑定对DataGrid.ItemsSource的工作效果与预期的一样,但我构建的绑定不适用于DataGridColumn.SortDirection。当单击列标题("Click“)时,我希望看到两个消息框,但只有一个出现。

我可以将BindingOperations.SetBinding(column, DataGridColumn.SortDirectionProperty, new Binding(nameof(SortDirection)) { Source = this, Mode = BindingMode.TwoWay });放在构造函数中,以便按照预期设置绑定,但我已经开始相信绑定应该用XAML构建,而不是在代码中构建。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-14 19:52:37

DataGridColumn不是可视元素,也不继承任何DataContext。您可以实现绑定代理来解决这个问题。有关示例和更多信息,请参见答案和博客文章。

但是我从小就相信绑定应该用XAML构建,而不是在代码中构建。

附带说明,以编程方式设置绑定没有任何问题。它不会破坏MVVM的设计模式。XAML是一种标记语言。如果确实需要,可以以编程方式实现整个视图。试图在XAML中做任何事情,仅仅是为了它,通常被认为是反模式。(相当)复杂的视图通常需要代码。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71115353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档