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

标签 c# .net wpf xaml data-binding

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

相关文章:

c# - 滚动包含 Expanders 的 ListView 不起作用

c# - 同时将两个 JToken 作为键/值对添加到字典中

c# - Windows Azure 平台上的演示应用程序?

.net - 不需要的 EmailAddressAttribute

c# - 我应该将每个类放在单独的文件中吗?

wpf - 在 InvalidateVisual() 之后未调用 OnRender

c# - Mongodb:如何检查一个点是否包含在多边形中?

c# - System.Object 是基类

wpf - 将您的 View 绑定(bind)到模型的属性而不是 ViewModel 有什么不好?

c# - Entity Framework -如何提高任何属性的OnChanging?