WPF: Как присоединить события от нажатия мыши к viewmodel?

TL; DR

Вы можете использовать нотацию понимания списка , чтобы преобразовать ваш массив в матрицу. Вот так

some_list[start:end:step]

Код

def transform(li):
    rows = len(li) // 10
    return [li[i:len(li):rows] for i in range(rows)]

Пример ввода

arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
       'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
       'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4']

Соответствующий выход

['A', 'D', 'G', 'J', 'M', 'P', 'S', 'V', 'Y', '2']
['B', 'E', 'H', 'K', 'N', 'Q', 'T', 'W', 'Z', '3']
['C', 'F', 'I', 'L', 'O', 'R', 'U', 'X', '1', '4']

Объяснение

[1122 ] «сгущенная» часть здесь - это li[i:len(li):rows], поэтому давайте объясним, что

  • Первый i внутри [] относится к началу подмассива
  • ]
  • Второй len(i) является концом подмассива
  • Третий rows является шагом . Здесь шаг равен числу строк, так как мы хотим перейти на количество строк, чтобы соответствовать ожидаемому результату в вашем вопросе

Мы извлекаем подмассив для каждая возможная строка, которая является то, что [... for i in range(rows)] для

5
задан Samuel Slade 20 March 2012 в 01:05
поделиться

5 ответов

Я придумал ответ на второй вопрос. Мне был нужен ItemsControl, поддерживающий прокрутку, и мне нужно было иметь элементы в Grid, а не в StackPanel по умолчанию. Чтобы выполнить оба требования, я использовал ControlTemplate:

<!--In the resources...-->
<ControlTemplate x:Key="GraphTemplate" TargetType="ItemsControl">
    <ScrollViewer Name="ScrollViewer"
                  Padding="{TemplateBinding Padding}"
                  HorizontalScrollBarVisibility="Auto">
        ...
            <Grid Name="Panel" IsItemsHost="True"
                  Background="{TemplateBinding ItemsControl.Background}"/>
        ...
    </ScrollViewer>
</ControlTemplate>
<!--Later...-->
<ItemsControl x:Name="_itemsControl" 
              ItemsSource="{Binding Items}"
              Template="{StaticResource GraphTemplate}"
              Background="LightYellow"/>

Чтобы получить события мыши с осмысленными координатами мыши (то есть координатами в прокручиваемом пространстве), необходимо было получить ссылку на сетку с помощью странного заклинания:

Grid grid = (Grid)_itemsControl.Template.FindName("Panel", _itemsControl);

Затем вы присоединяете обработчики событий к сетке, а внутри обработчиков событий мыши получите координаты мыши относительно сетки, используя

Point p = e.GetPosition((IInputElement)sender);

. Чтобы получить события мыши на всей поверхности, элемент управления (фактически сетка) должен иметь фон, поэтому Я установил Background = "LightYellow" выше, который распространяется на сетку через привязку в ControlTemplate.

2
ответ дан 18 December 2019 в 14:51
поделиться

Я нашел способ обрабатывать события, вызванные объектами в DataTemplate.

(1) присоедините обработчики событий к ItemsControl

<ItemsControl x:Name="_itemsControl" 
              Thumb.DragStarted="Node_DragStarted"
              Thumb.DragDelta="Node_DragDelta"
              Thumb.DragCompleted="Node_DragCompleted"
              MouseDoubleClick="OnMouseDoubleClick"
              .../>

(2), чтобы узнать, к какому элементу относится событие, обработайте OriginalSource как FrameworkElement и получите его DataContext:

void Node_DragStarted(object sender, DragStartedEventArgs e)
{
    var os = (FrameworkElement)e.OriginalSource;
    var vm = os.DataContext as ItemViewModel;
    if (vm != null)
        // do something with the item ViewModel
}
6
ответ дан 18 December 2019 в 14:51
поделиться

Да, задача массовой вставки SSIS использует те же функции подчеркивания, что и команда BULK INSERT.

Скорее всего, вы заметите различия в профилировщике SQL, потому что задача массовой вставки будет использовать подчеркивание COM-объекта напрямую (что обеспечивает массовую вставку), а не просто быть оболочкой графического интерфейса пользователя для команды T-SQL. Так что вместо указания FROM, я предполагаю, что он передает указатель открытого потока ввода-вывода в COM-объект.

Массовая вставка в значительной степени является самым быстрым способом загрузки большого количества данных в SQL Server, поскольку она выполняется внутри процесса », разделяют одно и то же адресное пространство памяти. Поскольку файлы данных открываются процессом SQL Server, данные не копируются между клиентским процессом и процессами SQL Server ». 1

Однако производительность будет отличаться, если файл находится в та же машина, что и SQL Server, или нет.

1
ответ дан 18 December 2019 в 14:51
поделиться

ViewModel должен быть отключен от GUI, чтобы он ничего не знал об элементах управления или щелчках мыши.

Два варианта:

  • Вызов команды в ViewModel, как предлагается by Thomas
  • Свяжите положение ползунка со свойством в ViewModel, а затем, когда элемент управления перемещается вокруг, WPF обновит значения положения в ViewModel.
3
ответ дан 18 December 2019 в 14:51
поделиться

У Беа Столльниц есть пример перетаскивания под названием «Как я могу перетаскивать элементы между элементами ItemsControls с привязкой к данным?». Я бы выложил ссылку, но StackOverflow мне не позволяет.

Возможно, вы захотите разделить обратную связь пользовательского интерфейса во время перетаскивания и действия, выполняемого, когда оно окончательно отбрасывается.

Однако я согласен с Томасом и Кэмероном выше. Вы захотите ограничить смешивание / сопоставление обработки событий и привязки данных. Если вы идете по маршруту обработки событий, возможно, вы не захотите избегать использования термина «модель представления» для своих объектов, поскольку он обычно обозначает альтернативу привязки данных.

1
ответ дан 18 December 2019 в 14:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: