WPF:我可以拥有多个具有不同 ItemsSource 的 ItemsControl 吗?

WPF: Can I have multiple ItemsControls with different ItemsSources?

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

THIS SO 问题表明也许我应该使用 CompositeCollection Class,但与引用的问题不同,我有几个完全不同的 Observable 集合用于完全不同的任务。

这是我的 XAML.CS 的相关部分,有两个集合:1 个自定义接口类型和 1 个自定义 Class 类型

 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 元素?一个参考和一些简单的解释就足够了,我可以 google 剩下的,我只是不知道,真的要找什么。

您好像设置了两次 ItemsSource。一次在后面的代码中,一次在 XAML 中。删除设置 Items 源的代码,只初始化可观察的集合。 XAML 应该负责绑定到集合。

您应该将 "PathControl" 的 ItemTemplate 属性 设置为您的数据模板:

    <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> 元素,您将向 ItemsControlItems 集合中添加一个 DataTemplate,并且您不能同时设置它的 ItemsSource 属性。

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

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