【问题标题】:Possible to define SortMemberPath conditionally with Converter?可以使用 Converter 有条件地定义 SortMemberPath 吗?
【发布时间】:2015-07-26 00:07:06
【问题描述】:

我有一个 DataGrid,其中包含一个由 StackPanel 中的 2 个不同可排序项共享的列。

这些项目都用于 NameA/NameB,而我想要的是 SortMemberPath 根据名为“sortByNameB”的布尔值的状态在这两者之间进行更改。

我在想的是使用带有静态资源的转换器来检查 sortByNameB 的状态,然后将某些内容返回给 SortMemberPath.. 但我不确定应该返回什么?我尝试将字符串返回为“NameA”/“NameB”,但这只是破坏了排序。

相关 XAML:

<DataGridTemplateColumn Header="Names" SortMemberPath="{Binding Converter={StaticResource NameSort}}">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <StackPanel Orientation="Vertical" VerticalAlignment="Center">
                <TextBlock Padding="1" HorizontalAlignment="Center">
                    <Hyperlink NavigateUri="{Binding Path=NameA}" RequestNavigate="Name_RequestNavigate">
                        <TextBlock Text="{Binding Path=NameA}" Foreground="{Binding RelativeSource={RelativeSource Self}, Path=Text, Converter={StaticResource FGName}}"/>
                    </Hyperlink>
                </TextBlock>
                <TextBlock Padding="1" HorizontalAlignment="Center">
                    <Hyperlink NavigateUri="{Binding Path=NameA}" RequestNavigate="Name_RequestNavigate">
                        <TextBlock Text="{Binding Path=NameB}" Foreground="{Binding RelativeSource={RelativeSource Self}, Path=Text, Converter={StaticResource FGName}}"/>
                    </Hyperlink>
                </TextBlock>
            </StackPanel>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

转换器:

public class NameSort : IValueConverter {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        return (ToolView.sortByNameB) ? "NameB" : "NameA";
    }
}

【问题讨论】:

    标签: c# wpf sorting datagrid converter


    【解决方案1】:

    如果您对“NameA”进行硬编码,排序是否有效?如果是这样,那么转换器将工作,因为它返回相同的东西,其他东西出了问题。

    您的 SortMemberPath 应该绑定到 Path=sortByNameB, Converter=... 不过。现在它只是绑定到对象本身,所以当 sortByNameB 发生变化时你不会调用转换器,我认为这就是你所说的“打破排序”的意思?

    【讨论】:

    • 如果我输入 SortMemberPath="NameA" 或 NameB,排序确实有效。我试过 {Binding Path=sortByNameB, Converter={StaticResource NameSort}} 但它不起作用。通过“打破排序”,我的意思是该列似乎不允许点击......它根本不排序,它根本不响应点击。我尝试将控制台输出添加到转换器,但控制台中没有出现任何内容,所以它甚至没有调用转换器?
    【解决方案2】:

    我想出了一个方法。

    我有一个复选框来控制 sortByNameB 的状态,为了这个例子,DataGrid 被命名为“dataGrid”,在 Checked/Unchecked 事件中添加:

    string toSortBy = (sortByNameB) ? "NameB" : "NameA";
    dataGrid.ColumnFromDisplayIndex(1).SortMemberPath = toSortBy;
    

    其中 '1' 是 Name 列的列索引。

    不确定这是否是一种真正优雅的方式,希望通过 xaml 中的绑定来实现,但至少很简单。

    【讨论】:

    • sortByNameB 是 DependencyProperty 吗?还是 DataContext 实现了 INPC?如果没有,它不会触发转换器。
    猜你喜欢
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多