簡體   English   中英

如何使用 XAML 在 WPF 中對 DataGridColumn.SortDirection 進行數據綁定?

[英]How do I databind DataGridColumn.SortDirection in WPF, using XAML?

這與數據綁定代碼中的 DataGrid 列 header有關,但它提出了相反的問題:“我如何在 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工作。 單擊列 header(“單擊我”)時,我希望看到兩個消息框,但只出現一個。


我可以把BindingOperations.SetBinding(column, DataGridColumn.SortDirectionProperty, new Binding(nameof(SortDirection)) { Source = this, Mode = BindingMode.TwoWay }); 在構造函數中按預期設置綁定,但我一直認為綁定應該在 XAML 中構建,而不是在代碼中構建。

DataGridColumn不是可視元素,不繼承任何DataContext 您可以實施綁定代理來解決此問題。 有關示例和更多信息,請參閱答案和博客文章。

但我從小就相信綁定應該在 XAML 中構建,而不是在代碼中。

附帶說明一下,以編程方式設置綁定並沒有錯。 它不會破壞 MVVM 設計模式。 XAML 是一種標記語言。 如果您確實願意,可以通過編程方式實現整個視圖。 僅僅為了它而嘗試在 XAML 中做所有事情通常被認為是一種反模式。 一個(相當)復雜的視圖通常需要代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM