Пользовательский элемент управления в шаблоне данных не показан

#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. Это работает! Спасибо