Хорошо, это, вероятно, довольно тупой вопрос, но я долго искал, но не смог найти решение для этого, которое работает ...
У меня есть пользовательский элемент управления, унаследованный от Control
, который должен включать код, стоящий за автоматизацией.
Для выбора выберите весь текст элементов управления TextBox
, если он выбран, или создайте список близких совпадений при изменении содержимого этого TextBox
.
public class vokDataGridEdit : Control
{
static vokDataGridEdit()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(vokDataGridEdit), new FrameworkPropertyMetadata(typeof(vokDataGridEdit)));
// Events internal to control (??? found on some how-to's)
EventManager.RegisterClassHandler(typeof(vokDataGridEdit), UIElement.GotKeyboardFocusEvent, new RoutedEventHandler(OnSelectContent), true);
}
// Dependecy Properties ...
// The Event that shall Fire when the TextBox gets Focus / Editing Mode
public static void SelectContent(object sender, RoutedEventArgs e)
{
if (sender is TextBox tb)
{
tb.SelectAll();
}
}
}
И элементы управления Стиль шаблона:
<ResourceDictionary xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ccont = "clr-namespace:App.Controls">
<!-- Default style for the Validation Buttons -->
<Style TargetType="{x:Type ccont:vokDataGridEdit}">
<Setter Property="SnapsToDevicePixels" Value="true" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ccont:vokDataGridEdit}">
<TextBox Text = "{Binding Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource AncestorType=ccont:vokDataGridEdit}}"
BorderThickness = "0"
ContextMenuService.Placement = "Right"
ContextMenuService.PlacementTarget = "{Binding Path=., RelativeSource={RelativeSource Self}}"
GotKeyboardFocus = "SelectContent">
<TextBox.ContextMenu>
<ContextMenu>
<ContextMenu.Template>
<ControlTemplate>
<Border CornerRadius = "5"
Background = "LightGray"
BorderThickness = "1"
BorderBrush = "Gray"
Padding = "2">
<StackPanel Orientation="Vertical">
<!-- Title -->
<TextBlock Text="Test" />
<!-- TODO: List of matches -->
<TextBox Text = "{Binding Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource AncestorType=ccont:vokDataGridEdit}}"
BorderThickness = "0" />
</StackPanel>
</Border>
</ControlTemplate>
</ContextMenu.Template>
</ContextMenu>
</TextBox.ContextMenu>
</TextBox>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
Вопрос 1: Как связать событие SelectContent
(чтобы выбрать все содержимое TextBox
, когда оно получит фокус, нб : это часть DataGrid
для CellEditingTemplate
) до GotKeyboardFocus
? События обычно нормальны в коде приложений, но для пользовательского элемента управления они не работают, так как на самом деле не существует «кода позади» для стиля ...
Вопрос 2: Предполагая, что я Свойство зависимости, содержащее массив слов. Основываясь на содержимом TextBox
, я хотел бы выбрать несколько слов из массива в свойстве зависимости и передать их в ListBox
в пользовательском элементе управления (Контент ListBox
должен управляться только Пользовательский элемент управления, никем не использующий этот элемент управления. Есть ли предпочтительная / каноническая схема MVVM для реализации этого?