gpt4 book ai didi

c# - 如何将 ListView 绑定(bind)到存储在 WPF 中单个 ViewModel 中的多个集合?

转载 作者:太空狗 更新时间:2023-10-29 21:19:40 24 4
gpt4 key购买 nike

我有 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com