我有一个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";
}
}
答案 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中的绑定来实现,但至少它很简单。