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?
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