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>
元素,您将向 ItemsControl
的 Items
集合中添加一个 DataTemplate
,并且您不能同时设置它的 ItemsSource
属性。
尝试这样做会导致 System.InvalidOperationException
异常被抛出,并显示您收到的错误消息。
多个 ItemsControl 绑定到同一个源集合是完全没问题的。
在我的 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>
元素,您将向 ItemsControl
的 Items
集合中添加一个 DataTemplate
,并且您不能同时设置它的 ItemsSource
属性。
尝试这样做会导致 System.InvalidOperationException
异常被抛出,并显示您收到的错误消息。
多个 ItemsControl 绑定到同一个源集合是完全没问题的。