2017-08-08 1 views
1

Je suis nouveau sur MVVM/WPF et après quelques heures de recherche, ne trouvant pas de réponse vraiment utile/fonctionnelle pour mon projet, j'ai décidé d'essayer essayez de demander ici.WPF sélectionnant un élément dans un ListBox à partir du ViewModel en utilisant SelectedIndex

Je souhaite sélectionner un élément dans ma zone de liste, qui utilise une liste en tant que ItemSource.

ViewModel pertinents:

public class FavoriteStructureVm : INotifyPropertyChanged 
{ 
    #region 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string propertyName) 
    { 
     if (this.PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    #endregion 

    public ObservableCollection<FavoriteDataVm> Favorites { get; set; } 
    public int SelectedIndex { get; set; } 
    private FavoriteDataVm _selectedItem; 
    public FavoriteDataVm SelectedItem 
    { 
     set 
     { 
      _selectedItem = value; 
      var item = (FavoriteDataVm)_selectedItem; 
      if (item.Type == FavoriteDataType.Add) 
      { 
       SelectedIndex = 1; 
      } 
     } 
    } 
} 

ListBox contient quelques éléments par défaut, le dernier étant toujours l'un des types Add, qui si elle est sélectionnée, peut ajouter un nouvel élément et sélectionnez par défaut ou sélectionnez l'élément précédemment sélectionné si aucun nouvel élément n'est ajouté. Pour la simplicité l'élément sélectionné sera juste 1 indépendamment du fait qu'un nouvel élément est ajouté ou non.

Peu importe où et que j'ai essayé de mettre à jour avec OnPropertyChanged il n'a pas mis à jour le SelectedIndex dans la vue, cependant, en ajoutant/l'insertion d'une nouvelle FavoriteDataVm dans ObservableCollection<FavoriteDataVm> Favorites, le SelectedIndex dans la vue est mise à jour. Le processus d'ajout d'un nouvel élément à la liste ne se produit pas toujours, néanmoins je voudrais toujours mettre à jour le SelectedIndex.

XAML pertinente:

<ListBox Name="favMenu" ItemsSource="{Binding Favorites}" SelectionMode="Single" 
         HorizontalAlignment="Center" VerticalAlignment="Top" 
         BorderThickness="0" Background="Transparent" Height="{Binding ElementName=window, Path=ActualHeight}" 
         SelectedItem="{Binding SelectedItem, Mode=TwoWay}" 
         SelectedIndex="{Binding SelectedIndex, Mode=TwoWay}" 
         > 
        <ListBox.Resources> 
         <Style TargetType="ListBoxItem"> 
          <Setter Property="Template"> 
           <Setter.Value> 
            <ControlTemplate TargetType="ListBoxItem"> 
             <Border Background="Transparent" SnapsToDevicePixels="true"> 
              <ContentPresenter /> 
             </Border> 
            </ControlTemplate> 
           </Setter.Value> 
          </Setter> 
         </Style> 
        </ListBox.Resources> 

        <!--changing default orientation--> 
        <ListBox.ItemsPanel> 
         <ItemsPanelTemplate> 
          <VirtualizingStackPanel Orientation="Vertical"/> 
         </ItemsPanelTemplate> 
        </ListBox.ItemsPanel> 

        <ListBox.ItemTemplate> 
         <DataTemplate> 
          <Border x:Name="Border" 
           BorderThickness="0" BorderBrush="Black" Background="{x:Null}" 
           Width="60" Height="60" CornerRadius="30" Margin="{Binding Margin}" 
           ToolTip="{Binding Name}"> 


           <Image Source="{Binding ImageUri}" Width="60" Height="60" Stretch="UniformToFill"> 
            <Image.Clip> 
             <EllipseGeometry RadiusX="30" RadiusY="30" Center="30,30"/> 
            </Image.Clip> 
           </Image> 
          </Border> 
         </DataTemplate> 
        </ListBox.ItemTemplate> 

       </ListBox> 

J'ai trouvé une solution de contournement de créer simplement un élément factice et retirez-le, car l'ajout de quelque chose semble mettre à jour le SelectedIndex dans la vue. Je ne le vois pas comme une solution car elle présente de nombreux inconvénients.

Donc, cela soulève un peu deux questions: en fait

  • Comment puis-je obtenir la mise à jour du SelectedIndex de la zone de liste?

Et une question de débutant, depuis que je suis nouveau à MVVM:

  • Est-ce une mise en œuvre correcte de MVVM?

Répondre

3

Comment puis-je mettre à jour l'SelectedIndex de la ListBox?

Vous pouvez obtenir l'index sélectionné en obtenant l'index de la SelectedItem dans la collection source:

int selectedIndex = (SelectedItem != null && Favorites != null) ? Favorites.IndexOf(SelectedItem) : -1; 

Et vous pouvez sélectionner un élément en définissant la propriété SelectedItem:

SelectedItem = Favorites[1]; //selects the second item 

Vous ne devez pas lier à la fois les propriétés SelectedItem et SelectedIndex du ListBox. Ceux-ci doivent être synchronisés. Supprimez SelectedIndex="{Binding SelectedIndex, Mode=TwoWay}" de votre XAML.

Notez également que si vous avez l'intention de mettre à jour une propriété source dynamique, vous devez augmenter le PropertyChanged de cette propriété pour la vue de rafraîchir:

private int _selectedIndex; 
public int SelectedIndex 
{ 
    get { return _selectedIndex; } 
    set { _selectedIndex = value; OnPropertyChanged("SelectedIndex"); } 
} 

private FavoriteDataVm _selectedItem; 
public FavoriteDataVm SelectedItem 
{ 
    set 
    { 
     _selectedItem = value; 
     OnPropertyChanged("SelectedItem"); 
    } 
} 
0

Vous n'êtes pas mettre à jour les SelectedIndex La déclaration doit être comme suit

 private int _selectedIndex ; 
    public int SelectedIndex{ 
    get{return _selectedIndex }; 
    set{_selectedIndex=value;OnPropertyChanged("SelectedIndex") }; 
    } 

De cette façon, la liste sera notifiée lorsque le selectedIndex change

« Désolé s'il y a des fautes de frappe, Je l'ai écrit directement ici et pas dans un éditeur de code, donc vous pourriez obtenir des fautes de frappe "

+0

merci de prendre le temps de lire ma question! Je n'ai pas essayé de mettre l'événement en place pour que ça fonctionne (probablement). Je ferai un essai plus tard quand je serai de retour à la maison et mettra à jour ce fil au besoin – Rikidere