2016-04-29 9 views
0

これは既に回答済みですが、Google上で見つけることができませんでした。それがあったなら私は謝罪します。 TargetViewModelの文字列プロパティに基づいてAからZのアルファベット順に取得しようとしているSortedObservableCollection<TargetViewModel>があります。私はTargetViewModelCompareToを実装しましたが、問題は、文字列プロパティが新しいタブを追加する方法として使用している+記号である特別な定数タブがあることです。これはすべてのタブの右側にある必要があり、+タブの前とタブの後ろにタブを追加する必要があります。タブの後には常に最も左の位置にする必要があります。タブに指定する方法はありますか?それは左側と右側にあり、2つのタブの間にすべてのタブを並べます。すなわち|メインタブ| |タブB |タブC | + |C#SortedObservableCollectionオブジェクトの文字列プロパティ

は、ここに私のCompareTo機能は次のようになります。

public int CompareTo(object obj) 
{ 
    if (obj == null) 
     return 1; 
    TargetViewModel tvm = obj as TargetViewModel; 
    if (tvm != null) 
    { 
     return string.Compare(tvm.Header, Header, StringComparison.CurrentCultureIgnoreCase); 
    } 

    throw new ArgumentException("Object is not a TargetViewModel"); 
} 
+0

あなたの投稿からは、 'TargetViewModel'sがソートされているロジックベースの理由がないようです。それはソートが純粋にビューのためであるようです。そのような場合は、 'SortedObservableCollection'の代わりに(カスタムソートと一緒に)ビューの' CollectionViewSource'を使うべきでしょう。 –

答えて

2

次のショーをどのように文字列に基づいて何をしたいん比較子を構築します。あなたの状況に簡単に適用できるはずです:

static void Main(string[] args) 
    { 
     List<string> items = new List<string> {"+", "A", "B", "V", "MainTab"}; 
     items.Sort(new CustomComparer()); 
     items.ForEach(Console.WriteLine); 
    } 

    class CustomComparer : IComparer<string> 
    { 
     public int Compare(string x, string y) 
     { 
      if (ReferenceEquals(x, y)) return 0; 
      if (x == null) return -1; 
      if (y == null) return 1; 
      if (x.Equals(y, StringComparison.Ordinal)) return 0; 

      if (x.Equals("MainTab", StringComparison.Ordinal)) return -1; 
      if (y.Equals("MainTab", StringComparison.Ordinal)) return 1; 

      if (x.Equals("+", StringComparison.Ordinal)) return 1; 
      if (y.Equals("+", StringComparison.Ordinal)) return -1; 

      return string.CompareOrdinal(x, y); 
     } 
    } 
+0

これは完璧に機能しました。返品を交換するだけでした! – CGideon

関連する問題