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

时间:2013-02-05 23:09:25

标签: c# wpf styles observablecollection itemscontrol

我有一个数组(存储为ObservableCollection)我正在动态实例化的数据,我将其链接到ItemsControl中的StackPanel。数据的格式如下:

public class VariableValueList<T>
{
    public String Name {get; private set;}
    public IList<T> Values {get; private set;}
    ...
}

我的ObservableCollection<VariableValueList<double>> IVCollection在构建之后与ItemsControl链接,其中包含以下内容:

MainWindow.xaml.cs

private void Open_OnClick(object sender, RoutedEventArgs e)
{
    ...
    IndependentVariables.ItemsSource = IVCollection;
}

IndependentVariables来自这里:

MainWindow.xaml

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

我需要构建样式IVCell才能访问每个VariableValueList<double>(一旦我得到它,获取其NameValues成员将是微不足道的。

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

  

名称

     

价值价值......

     

名称

     

价值价值......

     

...

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

  1. 如何为此阵列提供Style访问权限? (或者:我有阵列后如何修改样式?)

  2. 如何动态地在Style中实例化新元素(例如,对于每个数组元素)?

  3. 我非常感谢你的帮助。如果我试图以这种方式构建任何完全错误,请纠正我。我是WPF的新手。

1 个答案:

答案 0 :(得分:4)

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

简单的风格:

<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>