2017-08-31 1 views
0

Bedienelemente wie die ListBox haben eine ItemsSource Eigenschaft aufnehmen, die SieWie Itemssource und Artikel

<ListBox x:Name="ListBoxColours" ItemsSource="{Binding Colours}" /> 

binden kann es auch eine Items Eigenschaft jedoch hat, die dazu verwendet werden können Elemente im Code hinter

hinzufügen
ListBoxColours.Items.Add("Red"); 

ich erstelle eine Custom, die eine ListBox in hat. ich die ItemSource in meiner Kontrolle ausgesetzt haben, damit der Benutzer die Elemente auf eine Eigenschaft in ihrerbinden.

<ListBox 
    x:Name="PART_ListBox" 
    ItemsSource="{Binding ItemsSource, RelativeSource={RelativeSource AncestorType=local:TextBoxComboControl}}" 
    SelectionMode="Single" /> 

...

public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register(
    "ItemsSource", typeof(IEnumerable), typeof(TextBoxComboControl), new PropertyMetadata(default(IEnumerable))); 

public IEnumerable ItemsSource 
{ 
    get { return (IEnumerable) GetValue(ItemsSourceProperty); } 
    set { SetValue(ItemsSourceProperty, value); } 
} 

...

<local:TextBoxComboControl ItemsSource="{Binding Colours}" /> 

würde Ich mag die Fähigkeit hinzuzufügen, für einen Benutzer hinter als auch Elemente im Code hinzufügen allerdings einhüllen sie Ich möchte keine Bindung verwenden. Ich frage mich, wie die ItemSource/Items Eigenschaften miteinander interagieren. Um es ihnen zu ermöglichen, entweder peoprty zu verwenden, müsste ich die ListBox Elemente an beide Eigenschaften innerhalb meiner Kontrolle binden.

+1

Aus dem Abschnitt Hinweise zu den [Elementen] (https://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.items (v = vs.110).aspx) page: * Beachten Sie, dass Sie entweder die Items-Eigenschaft oder die ItemsSource-Eigenschaft verwenden, um die Auflistung anzugeben, die zum Generieren des Inhalts von ItemsControl verwendet werden soll. Wenn die ItemsSource-Eigenschaft festgelegt ist, wird die Items-Auflistung schreibgeschützt und mit fester Größe erstellt. * – Clemens

+1

Eigentlich würde ich sagen, dass Sie die Eigenschaft einfach "weiterleiten" müssten. '... Elemente {get => PART_ListBox.Items; set => PART_ListBox.Items = Wert; } '... – Fildor

+0

@Fildor Beachten Sie, dass Elemente eine schreibgeschützte Eigenschaft ist. – Clemens

Antwort

1

Die ListBox stammt von Selector, die von ItemsControl abgeleitet ist.

Wenn Sie sich den Quellcode schauen, um ItemsControl:

Sie können sehen:

/// <summary> 
///  ItemsSource specifies a collection used to generate the content of 
/// this control. This provides a simple way to use exactly one collection 
/// as the source of content for this control. 
/// </summary> 
/// <remarks> 
///  Any existing contents of the Items collection is replaced when this 
/// property is set. The Items collection will be made ReadOnly and FixedSize. 
///  When ItemsSource is in use, setting this property to null will remove 
/// the collection and restore use to Items (which will be an empty ItemCollection). 
///  When ItemsSource is not in use, the value of this property is null, and 
/// setting it to null has no effect. 
/// </remarks> 
    [Bindable(true), CustomCategory("Content")] 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
    public IEnumerable ItemsSource 
    { 
     get { return Items.ItemsSource; } 
     set 
     { 
      if (value == null) 
      { 
       ClearValue(ItemsSourceProperty); 
      } 
      else 
      { 
       SetValue(ItemsSourceProperty, value); 
      } 
     } 
    } 

Wenn Sie sich die Eigenschaft Items ansehen, die vom Typ ItemsCollection ist ... kann es in einem von zwei Modi sein (ItemsSource-Modus oder "Direkt" -Modus).

/// <summary> 
/// ItemCollection will contain items shaped as strings, objects, xml nodes, 
/// elements, as well as other collections. (It will not promote elements from 
/// contained collections; to "flatten" contained collections, assign a 
/// <seealso cref="System.Windows.Data.CompositeCollection"/> to 
/// the ItemsSource property on the ItemsControl.) 
/// A <seealso cref="System.Windows.Controls.ItemsControl"/> uses the data 
/// in the ItemCollection to generate its content according to its ItemTemplate. 
/// </summary> 
/// <remarks> 
/// When first created, ItemCollection is in an uninitialized state, neither 
/// ItemsSource-mode nor direct-mode. It will hold settings like SortDescriptions and Filter 
/// until the mode is determined, then assign the settings to the active view. 
/// When uninitialized, calls to the list-modifying members will put the 
/// ItemCollection in direct mode, and setting the ItemsSource will put the 
/// ItemCollection in ItemsSource mode. 
/// </remarks> 

Es gibt ein internes Mitglied _isUsingItemsSource genannt, die eingestellt wird,/gelöscht zu verfolgen, welcher Modus in ist - das macht verschiedene Verfahren/Eigenschaften verhalten sich unterschiedlich abhängig von der Betriebsart.

„Einzelteile“ werden über einen CollectionView zugegriffen wird (die in der _collectionView Element gehalten wird) - dies entweder zeigt auf eine InnerItemCollectionView, die den Zugang zu den direkten Artikel wickelt, oder ein CollectionView mit CollectionViewSource.GetDefaultCollectionView erstellt, wenn SetItemsSource aufgrund eines heißt " itemssource "wird gesetzt.

Sie stammen wahrscheinlich von Control, so dass Sie das ähnliche Verhalten bereitstellen müssen. Vielleicht kannst du von ItemsControl herleiten, um dieses Verhalten zu bekommen .... hängt natürlich von deiner Kontrolle ab, wenn das passend ist.

Verwandte Themen