我有 2 个集合要绑定(bind)到 ListView
中的单独 GridViewColumn
:
public class EffectView : INotifyPropertyChanged
{
ObservableCollection<Effect> effects;
public ObservableCollection<Effect> Effects
{
get { return this.effects; }
set
{
this.effects = value;
this.RaisePropertyChanged ( "Effects" );
}
}
ObservableCollection<EffectDescription> descriptions;
public ObservableCollection<EffectDescription> Descriptions
{
get { return this.descriptions; }
set
{
this.descriptions = value;
this.RaisePropertyChanged ( "Descriptions" );
}
}
}
我能做到:
<ListView ItemsSource="{Binding EffectView.Effects}">
<ListView.View>
<GridView>
<GridViewColumn Width="Auto"
DisplayMemberBinding="{Binding Name}"
Header="Name" />
<GridViewColumn Width="Auto"
DisplayMemberBinding="{Binding Opacity}"
Header="Opacity" />
<GridViewColumn Width="Auto"
DisplayMemberBinding="{Binding ?}"
Header="Description" />
</GridView>
</ListView.View>
</ListView>
但是所有内容的范围都是 EffectView.Effects
,但我希望默认范围是 EffectView
,这样我就可以轻松地将多个集合分配给 ListView
.
类似于:
<ListView ItemsSource="{Binding EffectView}">
<ListView.View>
<GridView>
<GridViewColumn Width="Auto"
DisplayMemberBinding="{Binding Effects Path=Name}"
Header="Name" />
<GridViewColumn Width="Auto"
DisplayMemberBinding="{Binding Effects Path=Opacity}"
Header="Opacity" />
<GridViewColumn Width="Auto"
DisplayMemberBinding="{Binding Descriptions Path=Usage}"
Header="Description" />
</GridView>
</ListView.View>
</ListView>
有什么办法可以做到这一点?
最佳答案
ListView 的 ItemsSource
是集合,其项目将出现在列表中。所以想一想你要求 ListView 做什么:
- 作为源集合,使用不是集合但包含它们的东西
- 对于列表中的每一行,显示一个集合中的一项和另一个集合中的一项
请注意第二点:每一行都必须显示 Events 集合中的一些项目和 Descriptions 集合中的一些项目。
它应该从每一项中挑选哪一项?这两个集合中的项目之间有什么关系?
看来您真正需要的是包含事件和描述的对象集合。然后您可以绑定(bind)到该集合以显示两个实体的元素。大致是这样的:
public class EffectView : INotifyPropertyChanged
{
ObservableCollection<EffectsAndDescriptions> effects;
public ObservableCollection<EffectAndDescriptions> Effects
{
get { return this.effects; }
set
{
this.effects = value;
this.RaisePropertyChanged ( "EffectsAndDescriptions" );
}
}
}
internal class EffectsAndDescriptions
{
public Effect Effect { get; set; }
public Description Description { get; set; }
}
现在您可以绑定(bind)到 EffectsAndDescriptions 集合(请注意,这假定 ListView 的父级 的 DataContext 是 EffectView
)
<ListView ItemsSource="{Binding EffectsAndDescriptions}">
<ListView.View>
<GridView>
<GridViewColumn Width="Auto"
DisplayMemberBinding="{Binding Effect.Name}"
Header="Name" />
<GridViewColumn Width="Auto"
DisplayMemberBinding="{Binding Effect.Opacity}"
Header="Opacity" />
<GridViewColumn Width="Auto"
DisplayMemberBinding="{Binding Description.Usage}"
Header="Description" />
</GridView>
</ListView.View>
</ListView>
关于c# - 如何将 ListView 绑定(bind)到存储在 WPF 中单个 ViewModel 中的多个集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5412797/