Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF具有ItemsSource属性的own UserControl_Wpf_Xaml_User Controls_Itemssource - Fatal编程技术网

WPF具有ItemsSource属性的own UserControl

WPF具有ItemsSource属性的own UserControl,wpf,xaml,user-controls,itemssource,Wpf,Xaml,User Controls,Itemssource,我想用ItemsSource属性创建一个自己的Usercontrol。 我已经创建了一个UserControl“myContainer”和一个UserControl“myItem”。现在我想在myContainer控件中显示myItem控件。因此,我在myContainer控件中声明了一个依赖属性ItemsSource。 但是,如果我启动一个测试项目并将集合绑定到itemssource属性,则不会发生任何事情。这是实现itemssource属性的正确方法吗 Xaml:myContainer &l

我想用ItemsSource属性创建一个自己的Usercontrol。 我已经创建了一个UserControl“myContainer”和一个UserControl“myItem”。现在我想在myContainer控件中显示myItem控件。因此,我在myContainer控件中声明了一个依赖属性ItemsSource。 但是,如果我启动一个测试项目并将集合绑定到itemssource属性,则不会发生任何事情。这是实现itemssource属性的正确方法吗

Xaml:myContainer

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

    </DockPanel>
</Grid>

您似乎有一个项目类型,基本上如下所示:

public class DataItem
{
    public string Header { get; set; }
    public object Content { get; set; }
}
您可以通过一个列表框来显示此类型的项目,列表框中的项目具有
DataTemplate
,由属性设置:

<ListBox ItemsSource="{Binding DataItems}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Border BorderThickness="3" BorderBrush="Aqua">
                <StackPanel Margin="10">
                    <TextBlock Text="{Binding Header}"/>
                    <ContentPresenter Content="{Binding Content}"/>
                </StackPanel>
            </Border>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
<ListBox ItemsSource="{Binding DataItems}">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <DockPanel />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
    ...
</ListBox>

编辑:除了使用DataTemplate,您还可以通过在
ItemsContainerStyle
中的样式中替换ListBoxItem的ControlTemplate来完全替换ListBoxItem的视觉外观:

<ListBox ItemsSource="{Binding DataItems}">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ListBoxItem">
                        <Border BorderThickness="3" BorderBrush="Aqua">
                            <StackPanel Margin="10">
                                <TextBlock Text="{Binding Header}"/>
                                <ContentPresenter Content="{Binding Content}"/>
                            </StackPanel>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ListBox.ItemContainerStyle>
    ...
</ListBox>

...

您的物品类型基本上如下所示:

public class DataItem
{
    public string Header { get; set; }
    public object Content { get; set; }
}
您可以通过一个列表框来显示此类型的项目,列表框中的项目具有
DataTemplate
,由属性设置:

<ListBox ItemsSource="{Binding DataItems}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Border BorderThickness="3" BorderBrush="Aqua">
                <StackPanel Margin="10">
                    <TextBlock Text="{Binding Header}"/>
                    <ContentPresenter Content="{Binding Content}"/>
                </StackPanel>
            </Border>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
<ListBox ItemsSource="{Binding DataItems}">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <DockPanel />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
    ...
</ListBox>

编辑:除了使用DataTemplate,您还可以通过在
ItemsContainerStyle
中的样式中替换ListBoxItem的ControlTemplate来完全替换ListBoxItem的视觉外观:

<ListBox ItemsSource="{Binding DataItems}">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ListBoxItem">
                        <Border BorderThickness="3" BorderBrush="Aqua">
                            <StackPanel Margin="10">
                                <TextBlock Text="{Binding Header}"/>
                                <ContentPresenter Content="{Binding Content}"/>
                            </StackPanel>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ListBox.ItemContainerStyle>
    ...
</ListBox>

...


从ListBox或ItemsControl派生并将属性设置为DockPanel要容易得多。通过重写,您可以创建自己的项目类型。@Clemens我想这是问题的答案,而不是注释。您能给我举个例子吗?从您的代码很难判断您将要实现什么。我猜您的项目将显示标题文本和一些其他内容(无论是什么)。你能提供更多关于你想要什么的信息吗?您的项目类型是什么以及如何可视化?您应该知道这篇文章:。从ListBox或ItemsControl派生并将属性设置为DockPanel要容易得多。通过重写,您可以创建自己的项目类型。@Clemens我想这是问题的答案,而不是注释。您能给我举个例子吗?从您的代码很难判断您将要实现什么。我猜您的项目将显示标题文本和一些其他内容(无论是什么)。你能提供更多关于你想要什么的信息吗?您的项目类型是什么以及如何可视化?您应该知道这篇文章:。有没有办法在listbox项目中显示usercontrol?我会这样做,但当我单击用户控件中的按钮时,例如,仅选择listboxitem,您可以设置而不是ItemTemplate。我只找到一种方法来设置listboxitem的样式,但我不能使用usercontrol中的对象:/我的意思是在样式设置器中设置listboxitem的ControlTemplate。请参阅我的编辑。我的操作与您的示例中完全相同,listboxitems显示正确,但我无法访问由绑定加载到contentpresenter中的usercontrol中的对象(按钮)。我看到按钮,但无法单击。是否有办法在列表框项目中显示usercontrol?我会这样做,但当我单击用户控件中的按钮时,例如,仅选择listboxitem,您可以设置而不是ItemTemplate。我只找到一种方法来设置listboxitem的样式,但我不能使用usercontrol中的对象:/我的意思是在样式设置器中设置listboxitem的ControlTemplate。请参阅我的编辑。我的操作与您的示例中完全相同,listboxitems显示正确,但我无法访问由绑定加载到contentpresenter中的usercontrol中的对象(按钮)。我看到了按钮,但不能点击它