Tengo un 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
}
Es posible que SelectedThing
se define en el ViewModel
cuando se carga la aplicación, por lo que yo quiero ser de estilo en consecuencia.
Funciona muy bien cuando abro la app y, a continuación, haga clic en un elemento, pero, ¿cómo puede el estilo se aplica a la carga?
He probado con:
<Style.Triggers>
<DataTrigger Binding="{Binding IsEnabled, RelativeSource={RelativeSource Mode=Self}}" Value="True">
<Setter Property="Background" Value="Purple" />
</DataTrigger>
</Style.Triggers>
Pero cada elemento de la ListBox
está habilitado, por lo que se aplica a cada elemento de carga.
EDITAR:
Después de depurar un poco, me enteré de que cuando la configuración de SelectedThing
la carga, SelectedItem
sigue siendo null
.
EDITAR:
Aquí está el OnLoaded
método en el ViewModel
, donde voy a instalar SelectedThing
si el usuario ha seleccionado, mientras que anteriormente el uso de la aplicación. El propósito es mantener a la selección después de cerrar y volver a abrir la aplicación.
public IAsyncRelayCommand OnLoadedCommand { get; set; }
En el constructor:
OnLoadedCommand = new AsyncRelayCommand(OnLoaded);
En la Vista:
<b:Interaction.Triggers>
<b:EventTrigger EventName="Loaded">
<b:InvokeCommandAction Command="{Binding OnLoadedCommand}" />
</b:EventTrigger>
</b:Interaction.Triggers>
El 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;
}
}