Problem komendą dla ListBoxItem

0

Witam, mam kolejny problem tym razem związany z obsługą komendy dla podwójnego kliknięcia w jeden z elementów wyświetlanych w listBoxie. Napisałem coś takiego lecz nie działa mi to niestety.

class LoadDataToPlayList : BindableBase
{
    public ICommand DoubleClickCommand { get; set; }

    public LoadDataToPlayList()
        {
            DoubleClickCommand = new DelegateCommand(DoubleClickAction);
        }

    private void DoubleClickAction()
        {
            MessageBox.Show("Success!");
        }
}




w klasie głównej:

`public partial class MainWindow : Window
    {

        public MainWindow()
        {
            InitializeComponent();

            LoadDataToPlayList loadDataToPlayList = new LoadDataToPlayList();

            FilesInPlayList.DataContext = loadDataToPlayList;

        }
    }

i w Xamlu:

 <ListBox x:Name="FilesInPlayList" ItemsSource="{Binding listOfLoadedFiles}" BorderThickness="0" >
                    <ListBox.InputBindings>
                        <MouseBinding MouseAction="LeftDoubleClick" Command="{Binding DoubleClickCommand}" />
                    </ListBox.InputBindings>
                </ListBox>

Wkleiłem tylko fragmenty kodu odpowiedzialne za podwójne kliknięcie. Dane do listboxa wczytują sie prawidłowo

0

A spróbuj zamiast:

<MouseBinding MouseAction="LeftDoubleClick" Command="{Binding DoubleClickCommand}" />

dać

<MouseBinding Gesture="LeftDoubleClick" Command="{Binding DoubleClickCommand}" />
0

Dalej to samo, jakby w ogóle nie wykrywało tego klikania. Zrobiłem analogiczny przykład tylko na pojedynczym labelu i zadziałało. Wydaje mi się, że problem jest w tym, że ja chce aby to klikanie wykrywało na każdym listBoxItemie.

1

Zaraz sobie przykład skleje i zobacze, ja uzywałem tego na datagridzie dla kilkania na poszczególne wiersze i działało. także datagrida możesz rozważyć jako alternatywe dla lisboxa.

Rzeczywiscie ListBoxItem pochłania eventa jeśli binding jest przypięty na poziomie całej kontrolki, ale jak przypniemy się na poziomie itema to już ładnie działa

<ListBox x:Name="FilesInPlayList" ItemsSource="{Binding listOfLoadedFiles}" HorizontalContentAlignment="Stretch" >
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}" >
                <TextBlock.InputBindings>
                    <MouseBinding MouseAction="LeftDoubleClick" Command="{Binding DataContext.DoubleClickCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}} }" />
                </TextBlock.InputBindings>
            </TextBlock>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
0

Dziękuje, rzeczywiście działa. Też miałem taki pomysł aby odnieść się do pojedynczego itema lecz nie wiedziałem jak to zrobić. Mógłbyś tak na szybko wytłumaczyć tą linijkę ?
<MouseBinding MouseAction="LeftDoubleClick" Command="{Binding DataContext.DoubleClickCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}} }" />

1

Jesteśmy w naszym ListBoxItemie i szukamy w drzewie wizualnym pierwszego przodka typu ListBox, i ustawiamy go jako źródło dla naszego bindinga

RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}} 

Naszym źródłem jest kontrolka, więc dobieramy się do jej DataContext'u który wskazuje na nasz VM, a tam mamy już naszą komendę

Binding DataContext.DoubleClickCommand,

Robi się to w ten sposób, bo każdy item w listbox/datagrid ma swój własny datacontext i bezpośrednio nie ma dostępu do datacontextu rodzica, a co za tym idzie VM podpiętego do widoku.

0

Dzięki. Mam jeszcze jedno mam nadzieję ostatnie pytanie. Jest ono powiązane dość mocno z tym przykładem więc nie zakładam nowego tematu. Chodzi mi o to jak zrobić coś takiego aby jedna klasa byla odwpowiedzialna za wczytywanie danych do listboxa a druga za to podwójne kliknięcie. Czyli ta komenda DoubleClickCommand bylaby w osonej klasie. Chodzi mi tu szczególnie o dataContext jak je przypisać, bo jeżeli sobie przypisze tak jak tutaj: FilesInPlayList.DataContext = loadDataToPlayList;to podwójne kliknięcie, które znajduje się w innej klasie już nie będzie działać. Po prostu mam do wyboru dwa obiekty, które moge przypisać do DataContextu listboxa. Nie da się obu naraz ? Ewentualnie myślałem żeby obiekt, w którym jest to podwójne kliknięcie poprzypisywać do dataContextów listBoxItemów ale nie wiem do konca jak to zrobić, wszelkie moje próby zakończyły się niepowodzeniem.

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