WPF eigenen UserControl mit ItemsSource-Eigenschaft

Erstellen Sie ein eigenes Usercontrol mit einer ItemsSource-Eigenschaft.
Ich habe ein UserControl erstellt "myContainer" und ich habe ein UserControl erstellt "myItem". Nun möchte ich zeigen, die myItem Steuerelemente in der myContainer Kontrolle. So erklärte ich einer dependency Property ItemsSource im myContainer Kontrolle.
Aber wenn ich ein testproject und binden Sie eine Sammlung, um die itemssource-Eigenschaft nichts passiert. ist das die richtige Art und Weise zu implementieren, die eine itemssource-Eigenschaft?

Xaml: myContainer

<UserControl x:Class="Control.myContainer"
         ...
         x:Name="myUserControl">
<Grid>
    <DockPanel x:Name="myDockPanel">

    </DockPanel>
</Grid>

Code Hinter myContainer

public partial class myContainer : UserControl, INotifyPropertyChanged
{
    public static readonly DependencyProperty ItemsSourceProperty =
            DependencyProperty.Register("ItemsSource", typeof(myItem), typeof(myContainer));

    public myContainer()
    {
        InitializeComponent();
        DataContext = this;
    }

    public ObservableCollection<myItem> ItemsSource
    {
        get
        {
            return (ObservableCollection<myItem>)GetValue(ItemsSourceProperty);
        }
        set
        {
            SetValue(ItemsSourceProperty, value);
            OnPropertyChanged("ItemsSource");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;

        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

Xaml myItem

<UserControl x:Class="Control.myItem"
         ... 
         d:DesignHeight="300" d:DesignWidth="300">
<Grid>
    <Border BorderThickness="1" BorderBrush="Black" CornerRadius="2">
        <DockPanel>
            <StackPanel DockPanel.Dock="Top" Background="LightGray">
                <DockPanel Margin="2,2,2,2">
                    <Button x:Name="Button_Close" DockPanel.Dock="Right" Width="14" Height="14" Margin="5,0,0,0" VerticalAlignment="Center"></Button>
                    <Button x:Name="Button_Undock" DockPanel.Dock="Right" Width="14" Height="14" Margin="5,0,0,0" VerticalAlignment="Center"></Button>
                    <TextBlock DockPanel.Dock="Left" VerticalAlignment="Center" FontWeight="Bold" Text="{Binding Header,UpdateSourceTrigger=PropertyChanged}"></TextBlock>
                </DockPanel>
            </StackPanel>
            <ContentPresenter DockPanel.Dock="Top" ContentSource="Content"></ContentPresenter>
        </DockPanel>
    </Border>
</Grid>

CodeBehind myItem

 public partial class myItem : UserControl, INotifyPropertyChanged
{
    public static DependencyProperty _Header =
            DependencyProperty.Register("Header", typeof(String), typeof(myItem), new UIPropertyMetadata("Item"));

    public myItem()
    {
        InitializeComponent();
        DataContext = this;
    }

    public String Header
    {
        get
        {
            return (String)GetValue(_Header);
        }
        set
        {
            SetValue(_Header, value);
            OnPropertyChanged("Header");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;

        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
  • Es wäre viel einfacher, abgeleitet von ItemsControl (ListBox oder und das ItemsPanel - Eigenschaft, um ein DockPanel. Durch das überschreiben GetContainerForItemOverride Sie können Ihre eigenen Element-Typ.
  • ich denke, das ist die Antwort auf die Frage, anstatt einen Kommentar
  • können Sie mir zeigen, ein Beispiel für das?
  • Aus dem code ist es schwer zu sagen, was genau du gehst zu erreichen. Ich denke, Ihr Artikel ist eine header-text und einige andere Inhalte (was immer das ist). Kannst du uns ein bisschen mehr Informationen über das, was Sie wollen? Was ist dein Element-Typ und wie soll es dargestellt werden?
  • Und Sie sollten wissen, diese Künstlichkeit: " Data-Template-Übersicht.
  • myitem hat zwei Teile. ein header(name des Inhalts) und einem content-Teil, wo ich laden will ein usercontrol. im container möchte ich laden Sie ein, zwei, drei oder mehr myitems, die angezeigt werden, unter.
  • Warum ein UserControl und nicht ein ListBoxItem mit einem DataTemplate? Das letztere wäre der typische Weg, es zu tun in WPF. Und bitte, wenn Sie die Antwort hier hinzufügen, @Clemens, um Sie zu kommentieren. Werde ich benachrichtigt werden, dann.
  • ich dachte, ich wäre flexibler mit dem usercontrol. denn für die nächsten Schritte, die ich wollte hinzufügen, drag & drop Funktionalität zum ändern der Elemente um. kennen Sie ein Beispiel, etwas zu tun, dass mit ein ListBoxItem? (drag/drop ist jetzt nicht so wichtig. zunächst möchte ich die Elemente in meinem container) 🙂
  • Haben Sie Lesen Sie die " Data-Template-Übersicht Artikel?
  • jetzt lese ich den Artikel und ich glaube, ich verstehe es, dass die Art und Weise, mit der Daten-Vorlage ist nicht so schlimm. ich will diese in vielen Orten, so konnte ich erstellen, der Daten-Vorlage als eine ressource.ich würde es bevorzugen, fügen Sie es in einem custom user control mit einem itemsource und dann die Daten-Vorlage. aber ich habe auch das problem mit der Abhängigkeit Eigenschaft
  • "ich habe auch das problem mit der Abhängigkeit Eigenschaft". Dann haben Sie nicht gelesen, die Antwort auf Ihre andere Frage.

InformationsquelleAutor user2025830 | 2013-02-26
Schreibe einen Kommentar