WPF MVVM 2x różne ListView, oba z SelectedItem powiązanym z tą samą właściwością ViewModelu

0

Mam w swoim Widoku, dwie kontrolki "ListView" obie wyświetlają kolekcje tego samego typu obiektów ale pierwsza, wyświetla "wszystkie wczytane" a druga tylko pewien zakres z tych wszystkich wczytanych.
"SelectedItem" każdej z ListView jest zbindowany do tej samej właściwości ModeluWidoku - nazwanej "ZaznaczonyProfil", ponieważ w innym miejscu w Widoku pokazuje szczegóły tego "ZaznaczonegoProfilu" - tam jest mnóstwo właściwości.

I generalnie chodzi mi o to że jak zaznaczę na ListView1 jakiś profil to chce zobaczyć jego szczegóły, ale jak zaznaczę jakiś profil na ListView2 to chce żeby to jego szczegóły się wyświetliły.
Czyli w skrócie: ostatnio zaznaczony profil, niezależnie na którym ListView, ma być wyświetlony w szczegółach.

Teraz mam tak ze jak zaznaczę cos na ListView1 a potem na ListView2 to faktycznie szczegóły mi się pokazują z tego zaznaczonego na ListView2 ale przy okazji na ListView1 ta belka zaznaczenia zostaje widoczna i mylnie może sugerować ze to stamtąd pochodzą szczegóły zaznaczonego profilu.

Próbowałem w obu ListView dać Mode=OneWayToSource ale to nie rozwiązuje problemu.
Teraz szukam sposobu aby podczas zaznaczenia na jednym ListView jakiegoś obiektu na drugim ListView zniknęła belka - ale nie wiem jak to osiągnąć.
Zależy mi na utrzymaniu tego w MVVM

Przykład definicji obu ListView i tego widoku szczegółów zaznaczonego profilu.

ListView z całą pulą wszystkich profili

<ListView Margin="2"  x:Name="ListView_WszystkieProfile" 
                                  ItemsSource="{Binding WczytaneProfileZPlikow}" 
                                  SelectedItem="{Binding ZaznaczonyProfil, Mode=OneWayToSource}">
                                <i:Interaction.Triggers>
                                <ListView.View>
                                    <GridView AllowsColumnReorder="False" >
                                        <GridView.ColumnHeaderContainerStyle>
                                            <Style TargetType="{x:Type GridViewColumnHeader}">
                                                <Setter Property="IsEnabled" Value="False"/>
                                                <Style.Triggers>
                                                    <Trigger Property="IsEnabled" Value="False">
                                                        <Setter Property="TextElement.Foreground" Value="Black"/>
                                                    </Trigger>
                                                </Style.Triggers>
                                            </Style>
                                        </GridView.ColumnHeaderContainerStyle>
                                        <GridView.Columns>
                                            <GridViewColumn Header="Nazwa pliku profilu"  DisplayMemberBinding="{Binding NazwaProfilu}"/>
                                        </GridView.Columns>
                                    </GridView>
                                </ListView.View>
                            </ListView>                            

ListView tylko z pewną grupą profili z puli wszystkich wczytanych profili

<ListView Margin="2"  x:Name="ListView_ProfileWybranejGrupy" 
                                  ItemsSource="{Binding ZaznaczonaNaLiscieGrupaProfili.ProfileTejGrupy}" 
                                  SelectedItem="{Binding ZaznaczonyProfil}">
                                <ListView.View>
                                    <GridView AllowsColumnReorder="False" >
                                        <GridView.ColumnHeaderContainerStyle>
                                            <Style TargetType="{x:Type GridViewColumnHeader}">
                                                <Setter Property="IsEnabled" Value="False"/>
                                                <Style.Triggers>
                                                    <Trigger Property="IsEnabled" Value="False">
                                                        <Setter Property="TextElement.Foreground" Value="Black"/>
                                                    </Trigger>
                                                </Style.Triggers>
                                            </Style>
                                        </GridView.ColumnHeaderContainerStyle>
                                        <GridView.Columns>
                                            <GridViewColumn Header="Nazwa pliku profilu"  DisplayMemberBinding="{Binding NazwaProfilu}"/>
                                        </GridView.Columns>
                                    </GridView>
                                </ListView.View>
                            </ListView>

Szczegóły zaznaczonego profilu

<Label Content="{Binding ZaznaczonyProfil.TempUp_01}" 
                               Grid.Row="1" Grid.Column="1" HorizontalAlignment="Center" Foreground="#FFEF8C12">
                            <Label.Resources>
                                <Style TargetType="Label" BasedOn="{StaticResource EtykietaNastawy}"/>
                            </Label.Resources>
                        </Label>
                        <Label Content="{Binding ZaznaczonyProfil.TempUp_02}" 
                               Grid.Row="1" Grid.Column="2" HorizontalAlignment="Center" Foreground="#FFEF8C12">
                            <Label.Resources>
                                <Style TargetType="Label" BasedOn="{StaticResource EtykietaNastawy}"/>
                            </Label.Resources>
                        </Label>
                        <Label Content="{Binding ZaznaczonyProfil.TempUp_03}" 
                               Grid.Row="1" Grid.Column="3" HorizontalAlignment="Center" Foreground="#FFEF8C12">
                            <Label.Resources>
                                <Style TargetType="Label" BasedOn="{StaticResource EtykietaNastawy}"/>
                            </Label.Resources>
                        </Label>
                        <!-- i tak dalej dla sekcji TempUp jest od 01 do 20 potem jest sekcja TempDown, a potem drugie tyle, tyle ze z VentUp i VentDown-->
0

tymczasowo poradziłem sobie tak, w sumie może nie warto się zmużdżać, ale jeżeli kiedyś pojawi się jakieś rozwiązanie żeby to zrobić z poziomu ModeluWidoku to byłoby fajnie.

private void ListView_Artykuly_GotFocus(object sender, RoutedEventArgs e)
        {
            ListView_Artykuly2.UnselectAll();
        }

        private void ListView_Artykuly2_GotFocus(object sender, RoutedEventArgs e)
        {
            ListView_Artykuly.UnselectAll();
        }
1

Chyba tak działa styl ListView. Aby osiągnąć to bez żadnej rzeźby w code behind to prawdopodobnie trzeba edytować domyślny styl ListView i na przykład ustawić kolor na transparentny.
https://docs.microsoft.com/en-us/dotnet/desktop/wpf/controls/listview-styles-and-templates?view=netframeworkdesktop-4.8#listviewitem-states
ListViewItem ma stan tak zwany SelectedUnfocused - być może o to chodzi.
Ale ręki nie dam sobie uciąć, nigdy nie zagłębiałem się, aż tak w style, ani nie miałem podobnego problemu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1