【发布时间】:2017-06-24 21:53:12
【问题描述】:
在我的 WPF 应用程序中,我希望有几个由用户在运行时生成的项目。这些来自不同的类,因此,我最初的想法是将它们添加到不同的 Observable 集合中,然后将它们用作 ItemsSources 或不同的 ItemsControls。但是,WPF 给了我错误System.InvalidOperationException:在使用 ItemsSource 之前,Items 集合必须为空。我不是 WPF 专家,但THIS SO 问题的答案似乎表明我只能拥有 1 个 ItemsControl。
THIS SO 问题表明也许我应该使用 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 元素?一个参考和一些简单的解释就足够了,其余的我可以自己google,我只是不知道该寻找什么。
【问题讨论】:
-
我看到的一个错误是您不需要在 XAML 中绑定
ItemsSource,并且还需要在构造函数中设置它。只设置成员属性(ProcessElements和PathElements)就足够了。这可能会导致异常。如果不是这样,哪一行会抛出异常? -
这不是问题的根源,但在后面的代码中设置 ItemsSource only 似乎有效,所以感谢您指出这一点!
标签: wpf xaml observablecollection itemscontrol itemssource