Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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
C# 用于将ObservableCollection解释为StackPanel元素的WPF样式_C#_Wpf_Styles_Observablecollection_Itemscontrol - Fatal编程技术网

C# 用于将ObservableCollection解释为StackPanel元素的WPF样式

C# 用于将ObservableCollection解释为StackPanel元素的WPF样式,c#,wpf,styles,observablecollection,itemscontrol,C#,Wpf,Styles,Observablecollection,Itemscontrol,我有一个动态实例化的数据数组(存储为可观察集合),并将其链接到堆栈面板中的项控件。数据的格式如下所示: public class VariableValueList<T> { public String Name {get; private set;} public IList<T> Values {get; private set;} ... } 其中,IndependentVariables源自此处: main window.xaml

我有一个动态实例化的数据数组(存储为
可观察集合
),并将其链接到
堆栈面板
中的
项控件
。数据的格式如下所示:

public class VariableValueList<T>
{
    public String Name {get; private set;}
    public IList<T> Values {get; private set;}
    ...
}
其中,
IndependentVariables
源自此处:

main window.xaml

        <StackPanel>
            <ItemsControl Name="IndependentVariables" Style="{StaticResource IVCell}"></ItemsControl>
        </StackPanel>

我需要构造Style
IVCell
来访问每个
VariableValueList
(一旦我得到了它,获取它的
名称和
值成员就变得微不足道了)

我需要格式化数据,以便为每个元素打印
名称
,如下所示:

名字

价值

名字

价值

利用现有的
StackPanel
。我知道这个问题至少有两个潜在的问题

  • 如何授予此阵列的样式访问权限?(或:拥有阵列后如何修改样式?)

  • 如何动态实例化样式中的新元素(例如,每个数组元素)


  • 我真的很感谢你的帮助。如果我试图以这种方式构造任何完全错误的东西,请纠正我。我是WPF的新手。

    您不需要额外的
    StackPanel
    ,因为
    ItemsControl
    将为项目创建自己的面板。 样式不需要访问数组,
    ItemsControl
    自动为所有项目创建和管理容器。您只需为这两种类型的项目提供
    DataTemplate
    。您可以使用另一个
    ItemsControl
    内部
    DataTemplate
    for
    VariableValueList
    来显示
    属性中包含的项。要获得水平布局,请为该
    ItemsControl
    设置自定义
    ItemsPanelTemplate

    开始时的简单样式:

    <Style TargetType="{x:Type ItemsControl}"
           x:Key="IVCell">
        <Setter Property="ItemTemplate">
            <Setter.Value>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding Name}" />
                        <ItemsControl ItemsSource="{Binding Values}">
                            <ItemsControl.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <WrapPanel />
                                    <!-- or <StackPanel Orientation="Horizontal"> -->
                                </ItemsPanelTemplate>
                            </ItemsControl.ItemsPanel>
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding}" Margin="2,0" />
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                        </ItemsControl>
                    </StackPanel>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

    您不需要额外的
    StackPanel
    ,因为
    ItemsControl
    将为项目创建自己的面板。 样式不需要访问数组,
    ItemsControl
    自动为所有项目创建和管理容器。您只需为这两种类型的项目提供
    DataTemplate
    。您可以使用另一个
    ItemsControl
    内部
    DataTemplate
    for
    VariableValueList
    来显示
    属性中包含的项。要获得水平布局,请为该
    ItemsControl
    设置自定义
    ItemsPanelTemplate

    开始时的简单样式:

    <Style TargetType="{x:Type ItemsControl}"
           x:Key="IVCell">
        <Setter Property="ItemTemplate">
            <Setter.Value>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding Name}" />
                        <ItemsControl ItemsSource="{Binding Values}">
                            <ItemsControl.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <WrapPanel />
                                    <!-- or <StackPanel Orientation="Horizontal"> -->
                                </ItemsPanelTemplate>
                            </ItemsControl.ItemsPanel>
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding}" Margin="2,0" />
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                        </ItemsControl>
                    </StackPanel>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    
    
    
    感谢您的回复。我的成员
    名称
    是否应该是代码隐藏中的依赖属性?我不知道如何将它们链接到
    IVCollection
    。我应该澄清一下。尝试在XAML中绑定时,
    Name
    value
    不注册为有效。如果我将
    DataType=“{x:Type local:MainWindow}”
    添加到
    DataTemplate
    ,我可以获得依赖性属性,但我不相信从长远来看这是我想要的。在表达式
    TargetProperty={Binding SourceProperty}
    -
    TargetProperty
    中必须是依赖性属性,但是
    SourceProperty
    可以是一个简单的属性。如果您确实需要这些属性作为绑定的目标,那么答案是“是”-它们必须是依赖性属性。通常,除非您正在开发自定义控件,否则您不需要为对象实现依赖性属性。好的。此时,我只想显示(访问)数据(IVCollection的成员)。而我没有。那么我的DataContext会关闭吗?它是
    DataContext=this在我的构造函数中。感谢您的回复。我的成员
    名称
    是否应该是代码隐藏中的依赖属性?我不知道如何将它们链接到
    IVCollection
    。我应该澄清一下。尝试在XAML中绑定时,
    Name
    value
    不注册为有效。如果我将
    DataType=“{x:Type local:MainWindow}”
    添加到
    DataTemplate
    ,我可以获得依赖性属性,但我不相信从长远来看这是我想要的。在表达式
    TargetProperty={Binding SourceProperty}
    -
    TargetProperty
    中必须是依赖性属性,但是
    SourceProperty
    可以是一个简单的属性。如果您确实需要这些属性作为绑定的目标,那么答案是“是”-它们必须是依赖性属性。通常,除非您正在开发自定义控件,否则您不需要为对象实现依赖性属性。好的。此时,我只想显示(访问)数据(IVCollection的成员)。而我没有。那么我的DataContext会关闭吗?它是
    DataContext=this在我的构造函数中。