在我的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元素?一个参考和一些简单的解释是绰绰有余的,我可以自己谷歌休息,我只是不知道,真正寻找什么。
答案 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应该负责绑定到集合。