Style SelectedItem dans la zone de liste lors du Chargement WPF

0

La question

J'ai un ListBox, en tant que tel:

<ListBox
    //other stuff
    ItemsSource="{Binding ViewModels, UpdateSourceTrigger=PropertyChanged}"
    SelectedItem="{Binding SelectedThing, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
    <ListBox.ItemContainerStyle>
          <Style TargetType="ListBoxItem"> 
                <Style.Triggers>
                       <Trigger Property="IsSelected" Value="True">
                             <Setter Property="Background" Value="Purple" />
                       </Trigger>
                </Style.Triggers>
          </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

ViewModel.cs:

public SomeType SelectedThing
{
     get => selectedThing;
     set => //set with INotifyPropertyChanged
}

public ObservableCollection<SomeType> ViewModels
{
     get => viewModels;
     set => //set with INotifyPropertyChanged
}

Il est possible que SelectedThing est défini dans le ViewModel lors du chargement de l'application, donc je veux qu'il soit de style en conséquence.

Il fonctionne très bien quand j'ouvre l'application et puis cliquez sur un élément, mais comment le style sera appliquée sur la charge?

J'ai essayé avec:

<Style.Triggers>
      <DataTrigger Binding="{Binding IsEnabled, RelativeSource={RelativeSource Mode=Self}}" Value="True">
            <Setter Property="Background" Value="Purple" />
      </DataTrigger>
</Style.Triggers>

Mais chaque point de l' ListBox est activé, de sorte qu'il s'applique à chaque élément à charge.

EDIT:

Après le débogage un peu, j'ai découvert que lors de la configuration de SelectedThing sur la charge, SelectedItem reste null.

EDIT:

Ici, c'est le OnLoaded méthode dans le ViewModel, où je suis en train de SelectedThing si l'utilisateur a sélectionné alors que, précédemment, à l'aide de l'application. Le but est de garder la sélection après la fermeture et la réouverture de l'application.

public IAsyncRelayCommand OnLoadedCommand { get; set; }

Dans le constructeur:

OnLoadedCommand = new AsyncRelayCommand(OnLoaded);

Dans la Vue:

<b:Interaction.Triggers>
    <b:EventTrigger EventName="Loaded">
        <b:InvokeCommandAction Command="{Binding OnLoadedCommand}" />
    </b:EventTrigger>
</b:Interaction.Triggers>

La méthode:

public async Task OnLoaded()
{
    //other stuff
    if (App.Current.Properties.Contains(nameof(SelectedThing)))
    {
          var selected = JsonConvert.DeserializeObject<SomeType>(App.Current.Properties[nameof(SelectedThing)].ToString());
          SelectedThing = selected;
    }
}
c# listbox mvvm wpf
2021-11-23 14:48:35
1

La meilleure réponse

2

La raison pour laquelle il n'existe aucun élément sélectionné est parce que vous êtes le réglage de la SelectedThing source de la propriété à une valeur qui n'est pas dans le ViewModels source de collecte.

Comme vous l'avez déjà découvert, cela fonctionne mieux:

var selectedViewModel = ViewModels.Where(x => x.SelectedThing == selected.SelectedThing).FirstOrDefault();
SelectedThing = selectedViewModel;

L'élément sélectionné doit être présent dans la collection source.

2021-11-24 15:36:53

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................