2016-09-26 5 views
2

私はtabcontrolにバインドされたObservableCollectionを持っています。wpfのObservableCollectionにバインドされているタブコントロール項目のタブ順を保存する方法は?

<TabControl 
    ItemsSource="{Binding Steps}" 
    SelectedItem="{Binding SelectedStep}" 
    CanUserReorder="{Binding EditMode}" 
</TabControl> 

ユーザーは、編集モードの場合、タブ項目を並べ替えることができます。 タブコントロールを使用してビューを終了すると、タブの順序が失われます。タブの順序はユーザーによって変更されました。 どうすればこの問題を防ぐことができますか?

ありがとうございました!

+0

CanUserReorderプロパティから来ていますか? – plast1k

+0

また、可能な複製http://stackoverflow.com/questions/9877125/tabcontrol-databinding-tabitem-order – plast1k

+0

このビューに添付されているビューモデルから。ブール値のプロパティです。 – Alex

答えて

0

私はそれを得ました! このソリューションは、mvvm-patternで実装されています。

コレクションのステップが変更されるたびに、アイテムを追加または削除してから、その位置を並べ替えます。 ビュー内のTabControlのTabItemは、ComponentOneのTabControlを使用するか、またはBea Stollnitzのドラッグ/ドロップ機能を使用して、ユーザーが並べ替えることができます。

のViewModel:

public class MyViewModel 
{ 
    public MyModel Model {/*get... set*/} 
    public ObservableCollection<StepViewModel> Steps {/*get... set...*/} 
    public StepViewModel SelectedStep {/*get... set...*/} 

    public MyViewModel() 
    { 
     Model = new MyModel(); 
     Steps = new ObservableCollection<StepViewModel>(); 
     Model.Steps = new ObservableCollection<StepModel>(); 
     // Load the saved Model with the steps and their positions 
     Model.Steps = LoadFromXml(); 

     Steps.CollectionChanged += Steps_OnCollectionChanged; 
     // Add the Steps in the right order 
     for (int i = 0; i < Steps.Count; i++) 
     { 
      var item = Steps.First(x => x.Position == i); 
      var vm = new StepViewModel(); 
      Steps.Add(vm); 
     } 
    } 

    private void Steps_OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     if (e.Action == NotifyCollectionChangedAction.Add) 
     { 
      foreach (StepViewModel vm in e.NewItems) 
      { 
       if (!Model.Steps.Contains(vm.Model)) 
        Model.Steps.Add(vm.Model); 
      } 
     } 
     else if (e.Action == NotifyCollectionChangedAction.Remove) 
     { 
      foreach (StepViewModel vm in e.OldItems) 
      { 
       if (Model.Steps.Contains(vm.Model)) 
        Model.Steps.Remove(vm.Model); 
      } 
     } 
     // Match the temporary collectionindex to a position-property 
     foreach (StepViewModel item in Steps) 
     { 
      item.Position = Steps.IndexOf(item); 
     } 
    } 

} 
関連する問題