2012-05-04 3 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> 

Однако, когда я запускаю приложение, вид флип показывает первый элемент, а не второй пункт.

Это намеренно ?, или это ошибка?

+0

Он также игнорирует SelectedIndex. Я не могу установить выделение на FlipView каким-либо образом на WinRT. Вы как-то решили эту проблему? – hendrix

ответ

10

Попробуйте

<FlipView 
    ItemsSource="{Binding Items}" 
    SelectedItem="{Binding SelectedItem, Mode=TwoWay}" /> 
  • ваш SelectedItem должен быть TwoWay обязательным для его работы, так как значение устанавливается как в контрольной, и модели представления.
+0

решил мою проблему. благодаря! –

1

В дополнение к тому, что сказал Филип, вы являетесь классом (MyDataContext), который должен уведомить пользовательский интерфейс, что свойство изменилось. Ваш ViewModel должны реализовать INotifyPropertyChanged и свойство необходимо инициировать событие PropertyChanged

public class ViewModel : INotifyPropertyChanged 
{ 
    private object _selectedItem; 

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

Вы также можете использовать класс BindableBase, который поставляется с образцами приложений

public class ViewModel : BindableBase 
{ 
    private object _selectedItem; 

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

Был имеющих один и тот же вопрос с FlipView и неспособность работать с BindableBase или TwoWay. Поскольку порядок списка не был для меня действительно темой, я создал метод для изменения порядка ItemsSource, чтобы начать с SelectedItem как первого элемента в коллекции.

В исходном коде результатом является новый ItemSource для FlipView, а не предыдущие элементы списка.

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

Это похоже на ошибку. Если вы отлаживаете свой код, вы заметите, что сначала ваш SelectedItem в виртуальной машине установлен в правый элемент, затем он устанавливает значение null, после чего он устанавливает первый элемент коллекции ItemsSource FlipView.

В качестве обходного пути я вижу настройку SelectedItem VM после загрузки события FlipView.

Смежные вопросы