Я новичок в создании пользовательского контроля. Я заложил основу для нового пользовательского элемента управления, основанного на классе Selector. Мое понимание заключалось в том, что я должен использовать этот класс, поскольку мне нужен элемент управления, чтобы иметь коллекцию Items и способность обрабатывать выбранные элементы. Я считаю, что изменение ItemTemplate, возможно, превзошло некоторые из этих возможностей, потому что я не получаю событие SelectionChanged на уровне управления или уровне приложения. Я бы подумал, если я прав, что есть какой-то тег SelectionRegion XAML, в который я могу вставить встроенные DataTemplate. Мне не повезло найти что-нибудь подобное. Посмотрев через Google некоторое время, я готов только спросить. Что мне не хватает? Ниже приведена разметка ItemTemplate. Спасибо за любую помощь. Спасибо еще больше, если вы можете сказать мне, почему текст в TextBlock заключен в круглые скобки, даже если данные отсутствуют.WPF - Селектор - Пользовательский контроль - SelectionChanged Event Not Firing
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<Border BorderBrush="Black" BorderThickness="1">
<TextBlock Text="{Binding}" Foreground="Black" Background="White" MinHeight="12" MinWidth="50"/>
</Border>
</DataTemplate>
</Setter.Value>
</Setter>
По просьбе комментатора, вот полный XAML для управления до сих пор:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SourceMedicalWPFCustomControlLibrary">
<Style TargetType="{x:Type local:MultiStateSelectionGrid}">
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<WrapPanel/>
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<Border BorderBrush="Black" BorderThickness="1">
<TextBlock Text="{Binding Code}" Foreground="Black" Background="White" MinHeight="12" MinWidth="50" Padding="2" ToolTip="{Binding Description}"/>
</Border>
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:MultiStateSelectionGrid}">
<StackPanel HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,0,0,0" Background="{TemplateBinding Background}">
<ContentPresenter HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,0,0,0" Content="{TemplateBinding Content}"/>
<ItemsPresenter/>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
И анемия фонового код, а также:
namespace SourceMedicalWPFCustomControlLibrary
{
public class MultiStateSelectionGridState
{
public Brush Background { get; set; }
public Brush Foreground { get; set; }
public Brush Border { get; set; }
public string Text { get; set; }
public MultiStateSelectionGridState()
{
Background = Brushes.White;
Foreground = Brushes.Black;
Border = Brushes.Black;
Text = String.Empty;
}
};
public class MultiStateSelectionGrid : Selector
{
public static readonly DependencyProperty ContentProperty =
DependencyProperty.Register("Content", typeof(object), typeof(MultiStateSelectionGrid),
new FrameworkPropertyMetadata(null,
FrameworkPropertyMetadataOptions.AffectsRender |
FrameworkPropertyMetadataOptions.AffectsParentMeasure));
public object Content
{
get { return (object)GetValue(ContentProperty); }
set { SetValue(ContentProperty, value); }
}
public static readonly DependencyProperty StatesProperty =
DependencyProperty.Register("States", typeof(List<MultiStateSelectionGridState>), typeof(MultiStateSelectionGrid),
new FrameworkPropertyMetadata(new List<MultiStateSelectionGridState>(),
FrameworkPropertyMetadataOptions.AffectsRender));
public List<MultiStateSelectionGridState> States
{
get { return (List<MultiStateSelectionGridState>)GetValue(StatesProperty); }
set { SetValue(StatesProperty, value); }
}
static MultiStateSelectionGrid()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(MultiStateSelectionGrid), new FrameworkPropertyMetadata(typeof(MultiStateSelectionGrid)));
}
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
this.SelectionChanged += new SelectionChangedEventHandler(MultiStateSelectionGrid_SelectionChanged);
}
void MultiStateSelectionGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
MessageBox.Show("Hi");
}
}
}
Добро пожаловать в переполнение стека. Нам нужно больше деталей, каков полный xaml вашего элемента управления и код позади, или просмотреть модель при использовании mvvm? –
из моего понимания селекторного класса, если вы проистекаете из него, то событие выбора нужно обрабатывать самостоятельно, будь то нажатие мыши, касание или клавиатура. если вы хотите иметь уже реализованное событие выбора, используйте listview или listbox. CMIIW. – dnr3
@ dnr3 Итак, точка использования класса Selector заключается только в том, что у него есть все переменные-члены для поддержки выбора? Это кажется немного бесполезным. – BillyD