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;
}
}