Eu tenho um ListBox
, como tal:
<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
}
É possível que SelectedThing
é definido no ViewModel
ao carregar o aplicativo, então eu quero que ele seja denominado em conformidade.
Ele funciona muito bem quando eu abrir o aplicativo e, em seguida, clique em um item, mas como o estilo a ser aplicado na carga?
Eu tentei com:
<Style.Triggers>
<DataTrigger Binding="{Binding IsEnabled, RelativeSource={RelativeSource Mode=Self}}" Value="True">
<Setter Property="Background" Value="Purple" />
</DataTrigger>
</Style.Triggers>
Mas a cada item da ListBox
está activada, portanto se aplica para cada item, mediante carga.
EDITAR:
Após a depuração um pouco, descobri que, quando a configuração SelectedThing
em carga, SelectedItem
continua null
.
EDITAR:
Aqui é o OnLoaded
método na ViewModel
, onde eu estou definição SelectedThing
se o usuário tiver selecionado a ele, enquanto, anteriormente, usando o aplicativo. O objetivo é manter a seleção depois de fechar e reabrir o aplicativo.
public IAsyncRelayCommand OnLoadedCommand { get; set; }
No construtor:
OnLoadedCommand = new AsyncRelayCommand(OnLoaded);
A Vista:
<b:Interaction.Triggers>
<b:EventTrigger EventName="Loaded">
<b:InvokeCommandAction Command="{Binding OnLoadedCommand}" />
</b:EventTrigger>
</b:Interaction.Triggers>
O método real:
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;
}
}