#c# #.net #wpf
#c# #.net #wpf
Вопрос:
У меня есть эта комбинация
lt;ComboBox x:Name="Renderer" ItemsSource="{Binding RendererItems}" ItemTemplate="{StaticResource DropDownItemTemplate}" SelectedIndex="0"gt; lt;i:Interaction.Triggersgt; lt;i:EventTrigger EventName="SelectionChanged"gt; lt;ei:CallMethodAction TargetObject="{Binding}" MethodName="RendererItemsSelectionChanged"/gt; lt;/i:EventTriggergt; lt;/i:Interaction.Triggersgt; lt;/ComboBoxgt;
И этот шаблон данных для элементов
lt;DataTemplate x:Key="DropDownItemTemplate"gt; lt;StackPanel Orientation="Horizontal"gt; lt;UserControl Content="{Binding Icon}" Width="24" Height="24"/gt; lt;TextBlock Text="{Binding Text}" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="10,0"/gt; lt;/StackPanelgt; lt;/DataTemplategt;
И данные поступают из:
public ObservableCollectionlt;ComboBoxItemModelgt; RendererItems { get; set; } = new ObservableCollectionlt;ComboBoxItemModelgt;(); public MainWindowViewModel() { RendererItems.Add(new ComboBoxItemModel() { Icon = new RenderedIcon(), Text = "Rendered" }); RendererItems.Add(new ComboBoxItemModel() { Icon = new WireframeIcon(), Text = "Wireframe" }); RendererItems.Add(new ComboBoxItemModel() { Icon = new ShadedIcon(), Text = "Shaded" }); RendererItems.Add(new ComboBoxItemModel() { Icon = new HiddenLinesIcon(), Text = "Hidden Lines" }); }
Класс ComboBoxItemModel определяется следующим образом:
public class ComboBoxItemModel { public UserControl Icon { get; set; } public string Text { get; set; } }
Первый раз, когда я нажимаю на комбинацию, отображается следующим образом:
Как вы можете видеть, у выбранного элемента нет значка
Во второй раз, когда я нажимаю на комбинацию, отображается вот так:
Теперь у выбранного мной элемента нет значка. Но я хочу, чтобы у комбинированных элементов всегда был значок.
Комментарии:
1. Почему ваше свойство модели представления объявлено как экземпляр вашего пользовательского элемента управления? Он должен быть объявлен как тип, который может быть присвоен свойству пользовательского элемента управления
Content
.
Ответ №1:
Элемент UIElement, подобный вашему UserControl Icon
, может иметь только один родительский элемент и, следовательно, может появляться в визуальном дереве только один раз. У вас вообще не должно быть элемента UIElement в качестве элемента данных модели представления.
Чтобы смоделировать значок, используйте растровое изображение или рисунок в изображении:
public class ComboBoxItemModel { public ImageSource Icon { get; set; } // assign a DrawingImage public string Text { get; set; } }
с
lt;DataTemplate x:Key="DropDownItemTemplate"gt; lt;StackPanel Orientation="Horizontal"gt; lt;Image Source="{Binding Icon}" Width="24" Height="24"/gt; lt;TextBlock Text="{Binding Text}" .../gt; lt;/StackPanelgt; lt;/DataTemplategt;
Альтернативой значку UserControl может быть заполнение прямоугольника визуальной кистью:
lt;DataTemplate x:Key="DropDownItemTemplate"gt; lt;StackPanel Orientation="Horizontal"gt; lt;Rectangle Width="24" Height="24"gt; lt;Rectangle.Fillgt; lt;VisualBrush Visual="{Binding Icon}"/gt; lt;/Rectangle.Fillgt; lt;/Rectanglegt; lt;TextBlock Text="{Binding Text}" .../gt; lt;/StackPanelgt; lt;/DataTemplategt;
Комментарии:
1. Но «Значок» — это не изображение, а пользовательский элемент управления, внутри которого есть много чего. Как я могу это сделать с помощью пользовательского элемента управления?
2. Смотрите отредактированный ответ о том, как это можно было бы сделать с помощью значка UserControl.
3. Это работает! Спасибо