如何数据绑定DataGridColumn.WPF中的SortDirection,使用XAML



这与代码中DataGrid列标题的数据绑定有关,但它提出了相反的问题:"如何在XAML中执行此操作&";,而不是";如何在代码中执行">

我已经构建了这个MainWindow.xaml

<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

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构建任何绑定。单击列标题("单击我"(时,我希望看到两个消息框,但只显示一个。


我可以将BindingOperations.SetBinding(column, DataGridColumn.SortDirectionProperty, new Binding(nameof(SortDirection)) { Source = this, Mode = BindingMode.TwoWay });放入构造函数中,以按预期设置绑定,但我从小就认为绑定应该在XAML中构建,而不是在代码中构建。

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

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

附带说明一下,以编程方式设置绑定没有错。它并没有打破MVVM的设计模式。XAML是标记语言。如果你真的想的话,你可以用编程的方式实现整个视图。试图在XAML中做所有的事情通常被认为是反模式的。(相当(复杂的视图通常需要代码。

最新更新