Wiersz Listview lub ListBox w całości reagujący na zdarzenie

Dyskusje na temat języka C# oraz biblioteki .NET
faraon
Nowicjusz
Posty: 2
Dołączył(a): piątek, 5 września 2014, 23:50

Wiersz Listview lub ListBox w całości reagujący na zdarzenie

Post przez faraon »

Witam,
mam taki problem - mam aplikację stworzoną w C# z użyciem m.in framework caliburn micro i mam wyswietlaną jakąś listę danych (rzecz dotyczy kontrolek Listview oraz ListBox) i teraz chcę aby po kliknięciu w OBOJĘTNIE KTÓRYM MIEJSCU jakiegoś wiersza z tej listy została wyzwolona akcja rozpoznająca który wiersz został klikniety. Z góry informuje że nie może tu być zastosowane caliburnowe "Item" i "ActiveItem", bo akurat aplikacja jest tak skonstruowana że w tym miejscu muszę się bez tego obejść.

Mam przykładowo taki kod:

Code: Zaznacz cały

<ListView Grid.Column="1" Grid.Row="1" wpf:GridViewColumnResize.Enabled="True" BorderBrush="Transparent" x:Name="TransfersView"
                  Background="#1F1F1F" Foreground="White" HorizontalContentAlignment="Stretch" >
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="      " DisplayMemberBinding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}, Converter={StaticResource IndexConverter}}">
                    </GridViewColumn>
                    <GridViewColumn>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox IsChecked="{Binding Path=IsMarkedForExport}" >
                                </CheckBox>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Width="140">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Path=Target.Id, Converter={StaticResource IdToContractorNameConverter}}" Padding="0,0,70,0">
                                    <i:Interaction.Triggers>
                                        <i:EventTrigger EventName="MouseLeftButtonDown">
                                            <cal:ActionMessage MethodName="ActivateRow" />
                                        </i:EventTrigger>
                                    </i:Interaction.Triggers>
                                    <TextBlock.ToolTip>
                                        <TextBlock>
                                            <Run Text="{Binding Path=Target.Id, Converter={StaticResource IdToContractorDataConverter}}" />
                                        </TextBlock>
                                    </TextBlock.ToolTip>
                                        </TextBlock>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
Jedyne co mi się udało zrobić to dodać trigera do kolumny. Ale to rozwiązanie jest o tyle złe, że przecież gdy kolumn jest 10 to przecież nie będę do każdej kolumny osobno kopiował tego samego trigera to jest delikatnie mówiąc nieprofesjonalne rozwiązanie. Jednak co najgorsze nawet jeżeli tak zrobimy TO I TAK TRIGER ZADZIAŁA TYLKO JAK KLIKNIEMY W TEKST, jeżeli klikniemy w "pusty obszar" wiersza - triger sie nie odpali, co dla użytkownika aplikacji jest nie do przyjęcia.

Próbowałem wstawić inne trigery w inne miejsca tak aby objął on cały wiersz a nie tylko jedną kolumnę, ale albo kompletnie nie reagował on na kliknięcie albo aplikacja wysypywała się przy próbie wyświetlenia listy z danymi. Straciłem na to naprawde wiele godzin. Podstawowym problemem jest tu chyba fakt że aplikacja jest zrobiona na MVVM caliburn micro, na zwykłym WPF-e, może byłoby łatwiej.
Przeglądałem sporo anglojęzycznych stron, ale nigdzie nie znalazłem DZIAŁAJĄCEGO rozwiązania.

Podejrzewam, że rozwiązanie jest banalne TYLKO TRZEBA WIEDZIEĆ JAK.

Z góry dzięki za wszelką pomoc.
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: Wiersz Listview lub ListBox w całości reagujący na zdarz

Post przez Morfidon »

Hej,

Dlaczego nie możesz skorzystać z:
SelectedIndex

?

Pozdrawiam
faraon
Nowicjusz
Posty: 2
Dołączył(a): piątek, 5 września 2014, 23:50

Re: Wiersz Listview lub ListBox w całości reagujący na zdarz

Post przez faraon »

Rzeczywiście z wykorzystaniem SelectedIndex da sie rozwiązać problem, z tym, że w związku z tym, że jest to MVVM caliburn micro to trzeba jakoś przekazać obiekt listy do ViewModela, ale to już można łatwo zrobić z pomocą trigera np:

Code: Zaznacz cały

  
        <ListView Grid.Column="1" Grid.Row="1" wpf:GridViewColumnResize.Enabled="True" BorderBrush="Transparent" x:Name="Transfers"
                  Background="#1F1F1F" Foreground="White" HorizontalContentAlignment="Stretch">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="      " DisplayMemberBinding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}, Converter={StaticResource IndexConverter}}">
                    </GridViewColumn>
...
...


      <Button Content="ActivateRow" Grid.Column="1" HorizontalAlignment="Left" Margin="144,39.2,0,0" Grid.Row="2" VerticalAlignment="Top" Width="75">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                    <cal:ActionMessage MethodName="ActivateRow">
                        <cal:Parameter Value="{Binding ElementName=Transfers}" />
                    </cal:ActionMessage>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Button>
Dzięki za naprowadzenie.

P. S.
Kupiłem kurs C# Tworzenie Aplikacji i dopiero uświadomiłem sobie jak wielu rzeczy jeszcze nie wiem o tej technologii.
Post Reply