C# WPF-将具有字符串列表的类绑定到ListBox

C# WPF-将具有字符串列表的类绑定到ListBox,c#,wpf,xaml,listbox,C#,Wpf,Xaml,Listbox,我在将多个列表绑定到列表框时遇到问题。我希望每个列表都有不同颜色的不同数据模板 我有以下的模型课 public class Users { public Members Members{ get; set; } } public class Members { public List<string> Moderators { get; set; } public List<string> Viewers { get; se

我在将多个列表绑定到列表框时遇到问题。我希望每个列表都有不同颜色的不同数据模板

我有以下的模型课

public class Users
{
        public Members Members{ get; set; }
}

public class Members
{
        public List<string> Moderators { get; set; }
        public List<string> Viewers { get; set; }
}
我绑定到这个列表框

<ListBox ItemsSource="{Binding Users.Members.Viewers}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding}" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
 </ListBox>

现在我只有一个列表绑定到列表框。它工作得很好,但我希望其他列表也绑定到同一个列表框。除此之外,我希望版主有一个不同的模板

我尝试了很多不同的方法,但似乎都不管用

  • 要合并两个列表并将其设置为ItemsSource,请使用CompositeCollection
  • WPF可以通过使用ItemTemplateSelector设置不同的模板,但它要求类在某些方面有所不同。您的类型是string,因此不会有任何不同。我的提示是创建enum,如下所示

    枚举成员类型 { 调解人 观众 }


  • 及以下类别:

    class Person
    {
        public string Name{get;set;}
        public MemberType Type{get;set;}
    }
    
    然后换成这个

    public class Members
        {
            public List<Person> Moderators { get; set; }
            public List<Person> Viewers { get; set; }
        }
    
  • 要合并两个列表并将其设置为ItemsSource,请使用CompositeCollection
  • WPF可以通过使用ItemTemplateSelector设置不同的模板,但它要求类在某些方面有所不同。您的类型是string,因此不会有任何不同。我的提示是创建enum,如下所示

    枚举成员类型 { 调解人 观众 }


  • 及以下类别:

    class Person
    {
        public string Name{get;set;}
        public MemberType Type{get;set;}
    }
    
    然后换成这个

    public class Members
        {
            public List<Person> Moderators { get; set; }
            public List<Person> Viewers { get; set; }
        }
    

    与其从原始对象中删除名称,为什么不保留它并根据原始类指定不同的颜色

    除此之外,我希望版主有一个不同的模板

    如果你只有字符串,那是不可能的。记住列表框最终只能看到一个列表;在一个列表中,如何将字符串标记为版主或查看器

    使用不同颜色的不同数据模板

    如果只有字符串,我建议您创建包装类,一个用于版主,一个用于查看者,然后将字符串投影到要保存的类中。然后你可以按照我下面的建议/例子来做


    通过使用复合集合来保存不同的项(或者如果实例具有这种公共性,则可以实际使用基类列表或接口列表),然后使用专门的数据模板来查找原始类,就可以做到这一点

    例子 我有两个班,一个叫
    Ships
    ,一个叫
    Passage
    。请注意,这两个类都有一个
    Name
    属性,但是可以对模板中的一个或两个使用
    Name
    以外的内容

    下面我定义了数据模板和我的列表框

    <Grid>
        <Grid.Resources>
            <DataTemplate DataType="{x:Type c:Ship}">
                <TextBlock Text="{Binding Path=Name}"
                            Foreground="Red" />
            </DataTemplate>
            <DataTemplate DataType="{x:Type c:Passage}">
                <TextBlock Text="{Binding Path=Name}"
                            Foreground="Blue" />
            </DataTemplate>
        </Grid.Resources>
        <ListBox Name="myListBox"
                    Height="300"
                    Width="200"
                    ItemsSource="{Binding MyCompositeCollection}">
        </ListBox>
    </Grid>
    
    在这里,我加载复合集合:

    var temp  = new CompositeCollection();
    
    Ships.ForEach(sh => temp.Add(sh));
    Passages.ForEach(ps => temp.Add(ps));
    
    MyCompositeCollection = temp;
    

    与其从原始对象中删除名称,为什么不保留它并根据原始类指定不同的颜色

    除此之外,我希望版主有一个不同的模板

    如果你只有字符串,那是不可能的。记住列表框最终只能看到一个列表;在一个列表中,如何将字符串标记为版主或查看器

    使用不同颜色的不同数据模板

    如果只有字符串,我建议您创建包装类,一个用于版主,一个用于查看者,然后将字符串投影到要保存的类中。然后你可以按照我下面的建议/例子来做


    通过使用复合集合来保存不同的项(或者如果实例具有这种公共性,则可以实际使用基类列表或接口列表),然后使用专门的数据模板来查找原始类,就可以做到这一点

    例子 我有两个班,一个叫
    Ships
    ,一个叫
    Passage
    。请注意,这两个类都有一个
    Name
    属性,但是可以对模板中的一个或两个使用
    Name
    以外的内容

    下面我定义了数据模板和我的列表框

    <Grid>
        <Grid.Resources>
            <DataTemplate DataType="{x:Type c:Ship}">
                <TextBlock Text="{Binding Path=Name}"
                            Foreground="Red" />
            </DataTemplate>
            <DataTemplate DataType="{x:Type c:Passage}">
                <TextBlock Text="{Binding Path=Name}"
                            Foreground="Blue" />
            </DataTemplate>
        </Grid.Resources>
        <ListBox Name="myListBox"
                    Height="300"
                    Width="200"
                    ItemsSource="{Binding MyCompositeCollection}">
        </ListBox>
    </Grid>
    
    在这里,我加载复合集合:

    var temp  = new CompositeCollection();
    
    Ships.ForEach(sh => temp.Add(sh));
    Passages.ForEach(ps => temp.Add(ps));
    
    MyCompositeCollection = temp;
    

    有趣的想法。可能需要添加一件事,例如显示如何将
    TemplateSelector
    中的内容连接到Xaml中的列表框中会很有帮助。我指出了TemplateSelector等关键字。您可以查找的所有内容都是这样的。如果已经有这样的例子,我想避免复制和粘贴。谢谢你的回答。遗憾的是,我只能将其中一个答案标记为正确。有趣的想法。可能需要添加一件事,例如显示如何将
    TemplateSelector
    中的内容连接到Xaml中的列表框中会很有帮助。我指出了TemplateSelector等关键字。您可以查找的所有内容都是这样的。如果已经有这样的例子,我想避免复制和粘贴。谢谢你的回答。遗憾的是,我只能将其中一个答案标记为正确。很好的解释!我没有提到我不能更改示例中提到的类,因为我从WebAPI“继承”了它们。但是我当然可以从字符串列表中创建新的类。@Shamshiel不要忘记,可以使用
    WebAPI
    类中的
    Partial
    类,实际上可以根据需要扩展属性。很好的解释!我没有提到我不能更改示例中提到的类,因为我从WebAPI“继承”了它们。但是我当然可以从字符串列表中创建新的类。@Shamshiel不要忘记,可以使用
    WebAPI
    类中的
    Partial
    类,实际上可以根据需要扩展属性。