WPF:我可以使用不同的ItemsSources有多个ItemsControls吗?

时间:2017-02-07 15:21:02

标签: wpf xaml observablecollection itemscontrol itemssource

在我的WPF应用程序中,我希望有几个用户在运行时生成的项目。这些来自不同的类,因此,我最初的想法是将它们添加到不同的Observable Collections,然后将它们用作ItemsSources od不同的ItemsControls。但是,WPF给出了错误 System.InvalidOperationException:在使用ItemsSource 之前,Items集合必须为空。我不是WPF专家,但THIS问题的答案似乎表明我只能有1个ItemsControl。

THIS所以问题表明我可能应该使用CompositeCollection类,但与引用的问题不同,我有几个完全不同的Observable Collections用于完全不同的任务。

以下是我的XAML.CS的相关部分,包含两个集合:1个自定义接口类型和1个自定义类型

 public MainWindow()
    {           
        InitializeComponent();          
        DefaultWindowDefinition.ItemsSource = ProcessElements = new ObservableCollection<IProcessSimulator>();
        PathControl.ItemsSource = PathElements = new ObservableCollection<VisualPath>();           
    }

以下是我尝试使用的XAML的相关部分:

<Grid           x:Name="MainGrid"
                Background="{StaticResource Alternating}"
                MouseLeftButtonUp="grid_MouseLeftButtonUp"
                ShowGridLines="True">
    <ItemsControl   Name="DefaultWindowDefinition"
                    ItemsSource="{Binding ProcessElements}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
               <!--HERE IS A LONG LIST OF ELEMENTS-->
            </DataTemplate>
        </ItemsControl.ItemTemplate>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
               <!--TEMPLATE FOR THE 1ST ITEMSCONTROL-->
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>

        <ItemsControl.ItemContainerStyle>
            <Style>
                <!--STYLE PROPERTIES FOR THE 1ST ITEMSCONTROL-->
            </Style>
        </ItemsControl.ItemContainerStyle>
    </ItemsControl>
    <ItemsControl Name="PathControl"
                    ItemsSource="{Binding PathElements}">
        <DataTemplate>
            <!--HERE IS A  LIST OF OTHER TYPE OFELEMENTS-->
        </DataTemplate>
    </ItemsControl>
</Grid>

我应该如何解决这个问题,或者更确切地说,我应该使用哪种C#/ WPF元素?一个参考和一些简单的解释是绰绰有余的,我可以自己谷歌休息,我只是不知道,真正寻找什么。

2 个答案:

答案 0 :(得分:1)

您应该设置&#34; PathControl&#34;的 ItemTemplate 属性。到您的DataTemplate:

    <ItemsControl Name="PathControl" ItemsSource="{Binding PathElements}">
        <ItemsControl.ItemTemplate> <!-- NOTE THIS -->
            <DataTemplate>
                <!--HERE IS A  LIST OF OTHER TYPE OFELEMENTS-->
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

如果省略<ItemsControl.ItemTemplate>元素,则要在DataTemplate的{​​{1}}集合中添加Items,并且您也无法设置其ItemsControl ItemsSource 1}}属性。

尝试这样做会导致System.InvalidOperationException异常被抛出,并显示您收到的错误消息。

几个ItemsControl绑定到同一个源集合完全没问题。

答案 1 :(得分:0)

您似乎正在设置ItemsSource两次。一旦进入后面的代码,一次进入XAML。删除设置Items源的后面的代码,然后初始化可观察的集合。 XAML应该负责绑定到集合。