2016-06-10 3 views
0

У меня есть ObservableCollection, который имеет список объектов.Привязка UserControl к элементу ListBox ItemSource

Я хотел бы привязать эту наблюдаемую коллекцию к ListBox, но не так, чтобы каждый объект отображался внутри ListView, но вместо этого каждый объект создает UserControl, который имеет сам объект в качестве входного параметра.

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

У меня есть этот код XAML в моем MainWindow.xaml

<ListBox HorizontalContentAlignment="Stretch" ItemsSource="{Binding Bills}" ItemContainerStyle="{StaticResource BillStyle}"> 
</ListBox> 

И это стиль, который вызывает UserControl

<Style TargetType="{x:Type ListBoxItem}" x:Key="BillStyle"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
       <ns:BillItem /> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

и в MainWindow.xaml.cs у меня есть:

ObservableCollection<Bill> Bills {get;set;} 

И внутри конструктора я добавил несколько объектов.

Я хотел бы, что объект Билл получает толкнул на пользовательский элемент управления таким образом:

UserControl BillItem (Bill BindedObject) 
{ ... } 

Но я не знаю, как сделать это.

ответ

0

На изображении есть элемент, который наследуется от ItemsControl, например listbox, а затем помещает объекты в свойство ObservableCollection в вашей виртуальной машине. то просто привязать к этому свойству в/ListBox или whatevers ItemsSource собственности ItemsControl

ItemSource = "{Binding MyObjectCollection}"

+0

Как это создаст UserControl для каждого объекта внутри ItemSource? – DethoRhyne

+0

Я изменил свой вопрос, можете ли вы его просмотреть? – DethoRhyne

+0

Я не уверен, что понимаю, почему вам нужен пользовательский контроль для каждого элемента. Правильно ли я предположить, что вы хотите, чтобы список для каждого элемента в вашей коллекции отображал его? Если это так, вам лучше использовать список для отображения всех ваших элементов, а затем второй список, который отображает подэлементы выбранного элемента в первом списке. – LiamHarries

1

Если я правильно понял, что вам нужно что-то вроде этого:

<ItemsControl ItemsSource="{Binding Path=ListOfObjects}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Vertical" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <local:MyUserControl MyProperty="{Binding}"/> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

MyUserControl должен иметь свойство зависимости, потому что вы не можете перейти к конструктору:

public object MyProperty 
{ 
    get { return (object)GetValue(MyPropertyProperty); } 
    set { SetValue(MyPropertyProperty, value); } 
} 

public static readonly DependencyProperty MyPropertyProperty = 
    DependencyProperty.Register("MyProperty", typeof(object), typeof(MyUserControl), new PropertyMetadata(false)); 
+0

Я никогда не думал об этом! Спасибо за идею! Однако во время выполнения я получаю следующую ошибку. «Предоставить значение в« System.Windows.StaticResourceExtension »- это исключение». в строке ListBox – DethoRhyne

+0

Я исправил верхний, но теперь я получаю 'Инициализатор типа для 'Billing_Components.BillItem 'выбрал исключение. 'Если я использую' PropertyMetadata (false) ', и я получаю ссылку на объект, не установленную на экземпляр объекта. если U не использует 'PropertyMetadata (false)' – DethoRhyne

+0

Когда я помещаю новый BillItem() внутри PropertyMetadata, тогда я получил пустой объект. – DethoRhyne

Смежные вопросы