可以使用Converter有条件地定义SortMemberPath吗?

时间:2015-07-26 00:07:07

标签: c# wpf sorting datagrid converter

我有一个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";
    }
}

2 个答案:

答案 0 :(得分:0)

如果您硬编码&#34; NameA&#34;,排序是否有效?如果是这样,那么转换器将工作,因为它返回相同的东西,其他东西出错了。

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

答案 1 :(得分:0)

我想出了一种如何做的方法。

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

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

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

不确定这是否是一种非常优雅的做法,本来希望通过xaml中的绑定来实现,但至少它很简单。