Не работают события MouseLeftButtonDown/Up между разными ListBox

166
12 мая 2019, 07:30

У меня есть View с ListBox:

<Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <ListBox ItemsSource="{Binding LB1}" Height="270">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Label Content="{Binding Path=Content}"
                           Background="BlanchedAlmond">
                        <i:Interaction.Triggers>
                            <i:EventTrigger EventName="MouseLeftButtonDown">
                                <i:InvokeCommandAction
                                        Command="{Binding DataContext.MLBD, 
                                        RelativeSource={RelativeSource 
                                        AncestorType={x:Type ListBox}, 
                                        Mode=FindAncestor}}"
                                        CommandParameter="{Binding}"/>
                            </i:EventTrigger>
                            <i:EventTrigger EventName="MouseLeftButtonUp">
                                <i:InvokeCommandAction
                                        Command="{Binding DataContext.MLBU, 
                                        RelativeSource={RelativeSource 
                                        AncestorType={x:Type ListBox}, 
                                        Mode=FindAncestor}}"
                                        CommandParameter="{Binding}"/>
                            </i:EventTrigger>
                        </i:Interaction.Triggers>
                    </Label>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <ListBox Grid.Column="1" ItemsSource="{Binding LB2}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Label Content="{Binding Path=Content}"
                           Background="BlanchedAlmond">
                        <i:Interaction.Triggers>
                            <i:EventTrigger EventName="MouseLeftButtonDown">
                                <i:InvokeCommandAction
                                    Command="{Binding DataContext.MLBD, 
                                    RelativeSource={RelativeSource 
                                    AncestorType={x:Type ListBox}, 
                                    Mode=FindAncestor}}"
                                    CommandParameter="{Binding}"/>
                            </i:EventTrigger>
                            <i:EventTrigger EventName="MouseLeftButtonUp">
                                <i:InvokeCommandAction
                                    Command="{Binding DataContext.MLBU, 
                                    RelativeSource={RelativeSource 
                                    AncestorType={x:Type ListBox}, 
                                    Mode=FindAncestor}}"
                                    CommandParameter="{Binding}"/>
                            </i:EventTrigger>
                        </i:Interaction.Triggers>
                    </Label>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>  

И ViewModel с реализацией событий MouseLeftButtonDown/Up для обмена Content между ListBoxItem

    public List<Label> LB1 { get; set; }
    public List<Label> LB2 { get; set; }
    public Label Swap { get; set; }
    public MainWindowViewModel()
    {
        LB1 = new List<Label>()
        {
            new Label() { Content="10"},
            new Label() { Content="20"},
            new Label() { Content="30"}
        };
        LB2 = new List<Label>()
        {
            new Label() { Content="01"},
            new Label() { Content="02"},
            new Label() { Content="03"}
        };
        Swap = new Label();
    }

    public Command<Label> MLBD => new Command<Label>((label) =>
    {
        Swap = label;
    });
    public Command<Label> MLBU => new Command<Label>((label) =>
    {
        string text = label.Content.ToString();
        label.Content = Swap.Content;
        Swap.Content = text;
    }); 

В пределах о одного ListBox всё работает нормально, но когда MouseLeftButtonDown делаю в одном ListBox а MouseLeftButtonUp в другом то событие MouseLeftButtonUp не срабатывает. А если MouseLeftButtonUp сделать в месте где нет контролов а потом на другой ListBox то обмен происходит, хотя так быть не должно.

Подскажите как исправить ситуацию. Всё делал в Catel с использованием Fody.

Answer 1

Оказалось проблема в том что ListBox автоматически делает захват мыши, для решения добавляем следующий обработчик MouseLeave для Label:

                            <i:EventTrigger EventName="MouseLeave">
                                <i:InvokeCommandAction
                                Command="{Binding DataContext.CaptureOff, 
                                    RelativeSource={RelativeSource 
                                    Mode=FindAncestor, AncestorType=ListBox}}"
                                CommandParameter="{Binding}"/>
                            </i:EventTrigger>    

и сама логика:

    public Command CaptureOff => new Command(() =>
    {
        Mouse.Capture(null);
    });
READ ALSO
Button submit без перезагрузки

Button submit без перезагрузки

решил создать простенький тест на php, может кто подсказать какой ajax код надо написать чтобы при нажатии на кнопку страничка не перезагружаласьВот...

318
Что почитать или посмотреть, чтобы в совершенстве овладеть CMS Drupal и Bitrix? [закрыт]

Что почитать или посмотреть, чтобы в совершенстве овладеть CMS Drupal и Bitrix? [закрыт]

Подскажите пожалуйста литературу или подкасты, чтобы помимо умения выполнять абсолютно любые задачи на данных cms, ещё и уметь создавать шаблоны,...

177
Никак не отправляется запрос

Никак не отправляется запрос

Пересмотрел кучу видео, статей, делал всё как там, запрос не отправляется, никакой реакции от скриптаjQuery подключён, работает

149
Долгое выполнение скрипта PHP и fastcgi_read_timeout

Долгое выполнение скрипта PHP и fastcgi_read_timeout

Есть скрипт который может работать очень долго, более 1 часа, но из за fastcgi_read_timeout он тупо отрубается, и не может до конца выполнить работуКак...

153