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>
我需要构造StyleIVCell
来访问每个VariableValueList
(一旦我得到了它,获取它的名称和值成员就变得微不足道了)
我需要格式化数据,以便为每个元素打印名称
和值
,如下所示:
名字
价值
名字
价值
利用现有的StackPanel
。我知道这个问题至少有两个潜在的问题
如何授予此阵列的样式访问权限?(或:拥有阵列后如何修改样式?)
如何动态实例化样式中的新元素(例如,每个数组元素)
我真的很感谢你的帮助。如果我试图以这种方式构造任何完全错误的东西,请纠正我。我是WPF的新手。您不需要额外的StackPanel
,因为ItemsControl
将为项目创建自己的面板。
样式不需要访问数组,ItemsControl
自动为所有项目创建和管理容器。您只需为这两种类型的项目提供DataTemplate
。您可以使用另一个ItemsControl
内部DataTemplate
forVariableValueList
来显示值
属性中包含的项。要获得水平布局,请为该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
forVariableValueList
来显示值
属性中包含的项。要获得水平布局,请为该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代码>在我的构造函数中。