2012-05-04 6 views
5

FlipViewを使用していくつかのアイテムを表示し、特定のアイテムの表示を開始したいと考えています。このためFlipViewがSelectedItemを無視する理由

は、私は、ビューモデルクラスを定義している:あなたが見ることができるように

class MyDataContext 
{ 

    public MyDataContext() 
    { 
     Items = new List<MyClass>(); 
     Items.Add(new MyClass("1")); 
     Items.Add(new MyClass("2")); 
     Items.Add(new MyClass("3")); 
     SelectedItem = Items[1]; 
    } 

    public List<MyClass> Items { get; set; } 
    public MyClass SelectedItem { get; set; } 
} 

は、選択された項目がない最初の項目です。 XAMLのための今

<FlipView ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}"></FlipView> 

私はアプリを実行したときただし、フリップビューは最初のアイテムではなく、2番目の項目を示しています。

これは意図的なのですか、それともバグですか?

+0

SelectedIndexも無視されます。私はWinRT上でFlipViewで何らかの選択をすることができません。何とかこの問題を解決しましたか? – hendrix

答えて

10

値を制御し、ビューモデルの両方で設定されているので、あなたのSelectedItemは、それが動作するために結合双方向にする必要があり、この

<FlipView 
    ItemsSource="{Binding Items}" 
    SelectedItem="{Binding SelectedItem, Mode=TwoWay}" /> 
  • を試してみてください。
+0

は私の問題を解決しました。ありがとう! –

1

フィリップ氏が述べたことの上に、クラス(MyDataContext)が、プロパティが変更されたことをUIに通知する必要があります。 INotifyPropertyChangedのとプロパティを実装する必要がありますあなたのViewModelはあなたにも

public class ViewModel : BindableBase 
{ 
    private object _selectedItem; 

    public object SelectedItem 
    { 
     get { return this._selectedItem; } 
     set { this.SetProperty(ref this._selectedItem, value); } 
    } 
} 
5

FlipViewと同じ問題を抱えていたサンプルアプリケーションが付属していますBindableBaseクラスを使用することができますPropertyChangedイベントに

public class ViewModel : INotifyPropertyChanged 
{ 
    private object _selectedItem; 

    public object SelectedItem 
    { 
     get { return _selectedItem; } 
     set 
     { 
      _selectedItem = value; 
      OnPropertyChanged("SelectedItem"); 
     } 
    } 
} 

を発射する必要がありますBindableBaseまたはTwoWayオプションを動作させることができません。リストの順序は本当に私の話題ではなかったので、ItemsSourceの順序を変更してSelectedItemをCollectionの最初の項目として開始するメソッドを作成しました。

下位のコードでは、前のList要素ではなくFlipViewの新しいItemsSourceが結果になります。

public static List<T> ReorderList(List<T> elements, T selectedElement) 
    { 
     var elementIndex = elements.FindIndex(x => x.Id == selectedElement.Id); 
     var result = new List<T>(); 

     foreach (var item in elements) 
     { 
      if (elementIndex .Equals(elements.Count)) 
      { 
       elementIndex = 0; 
      } 

      result.Add(elements[elementIndex]); 

      elementIndex++; 
     } 

     return result; 
    } 
+0

+1、現在この回避策を使用していますが、それは一時的な解決策に過ぎません。 – hendrix

0

これはバグのようです。 コードをデバッグすると、VMの最初のSelectedItemが正しい要素に設定されてからnullに設定され、その後、FlipViewのItemsSourceコレクションの最初の要素に設定されます。

回避策として、FlipViewのLoadedイベントが発生した後に、VMのSelectedItemを設定しています。

関連する問題