2

全て、

私は次のクラスを持っています

public class MyCoolClass
{
    public string Field1{ get; set; }
    public int? Field2{ get; set; }
}

私は別のクラスを持っています

public class MyOtherClass
{
    ///a bunch of neat properties
    public MyCoolClass CoolClass { get; set; }
}

私はバインドする MyOtherClass のコレクションを持っています: C#:

public ObservableCollection<MyOtherClass> MyCoolDataSource { get; }

XAML:

<GroupBox DataContext="{Binding Path=MyCoolDataSource, UpdateSourceTrigger=PropertyChanged}" Header="Test DataGrid">
    <DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <!--A bunch of neat fields-->
            <DataGridComboBoxColumn Header="CoolClass" SelectedItem={"Binding Path=CoolClass, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
                <DataGridComboBoxColumn.ItemTemplate>
                    <!--DataTemplate that shows all properties of MyCoolClass-->
                </DataGridComboBoxColumn.ItemTemplate>
            </DataGridComboBoxColumn>
        </DataGrid.Columns>
    </DataGrid>
</GroupBox>

さて、私の質問は、特定のフィールドで並べ替えるオプションが必要だとしましょう (.Net 4.0 を使用)。WPF では、これは問題ありません。SortMemberPath を使用するだけです。ただし、DataGrid の CoolClass 列の MyCoolClass のすべてのフィールドで並べ替えたいとしましょう。これは純粋に XAML から行うことができますか、それとも並べ替えのために 2 つのフィールドを結合するプロパティを C# で作成することに固執していますか?

ありがとう。

4

1 に答える 1

0

Linq を使用してみることができます。ObservableCollection を List に置き換えましたが、ロジックは同じである必要があります。

List<MyOtherClass> MyCoolDataSource = new List<MyOtherClass>();

MyCoolDataSource.Add(new MyOtherClass { CoolClass = new MyCoolClass { Field1 = "Z", Field2 = 123 } });
MyCoolDataSource.Add(new MyOtherClass { CoolClass = new MyCoolClass { Field1 = "A", Field2 = 3 } });
MyCoolDataSource.Add(new MyOtherClass { CoolClass = new MyCoolClass { Field1 = "J", Field2 = 4 } });
MyCoolDataSource.Add(new MyOtherClass { CoolClass = new MyCoolClass { Field1 = "K" } });

var sortedByField1 = MyCoolDataSource.OrderBy(e => e.CoolClass.Field1).ToList();
var sortedByField2 = MyCoolDataSource.OrderBy(e => e.CoolClass.Field2).ToList();

//display
Console.WriteLine("Ordered by first filed");
sortedByField1.ForEach(e => {
    Console.WriteLine(string.Format("Field 1: {0}, Field 2: {1}", e.CoolClass.Field1, e.CoolClass.Field2));
});

Console.WriteLine("Ordered by second filed");
sortedByField2.ForEach(e => {
    Console.WriteLine(string.Format("Field 1: {0}, Field 2: {1}", e.CoolClass.Field1, e.CoolClass.Field2));
});
于 2013-01-30T00:00:51.070 に答える