Estilo SelectedItem en el cuadro de lista de Carga de WPF

0

Pregunta

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;
    }
}
c# listbox mvvm wpf
2021-11-23 14:48:35
1

Mejor respuesta

2

La razón por la que no hay ningún elemento seleccionado es porque se establece el SelectedThing origen de la propiedad a un valor que no está en la ViewModels colección de origen.

Como ya se ha descubierto, esto funciona mejor:

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

El elemento seleccionado debe estar presente en la colección de origen.

2021-11-24 15:36:53

En otros idiomas

Esta página está en otros idiomas

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