Member 13914292 Ответов: 1

Как можно привязать данные словаря<string, list<string> к списку в C#-WPF?


namespace WPFDataBinding
{
    public partial class MainWindow : Window
    {
        public Person Obj { get; set; }
        public MainWindow()
        {
            InitializeComponent();
            Obj = new Person();
            List<string> subjects1 = new List<string>();
            subjects1.Add("C");
            subjects1.Add("C++");
            subjects1.Add("C#");
            List<string> subjects2 = new List<string>();
            subjects2.Add("JAVA");
            subjects2.Add("JS");
            subjects2.Add("CSS");
            Obj.studDetail.Add("Kush", subjects1);
            Obj.studDetail.Add("Yash", subjects2);
            DataContext = this;
        }
        public class Person
        {
            private Dictionary<string, List<string>> StudDetail = new Dictionary<string, List<string>>();
            public Dictionary<string, List<string>> studDetail
            {
                get { return StudDetail; }
                set { StudDetail = value; }
            }}}}
WPF...
<Window> 
        Title="MainWindow" Height="350" Width="525">
    <ListBox Background="Gray">
        <ItemsControl x:Name="dictionaryItemsControl" ItemsSource="{Binding Person}">
            <Label Content="{Binding Obj}">
                <Label.ContentTemplate>
                    <DataTemplate>
                       <Label Name="Sub1" FontSize="30" Content="{Binding studDetail}"
                               Margin="2" Height="Auto" Width="Auto" />
                    </DataTemplate>
                </Label.ContentTemplate>
            </Label>
        </ItemsControl>
    </ListBox>
</Window>


Что я уже пробовал:

я сделал этот код, но выход вышел---->(коллекция)

1 Ответов

Рейтинг:
2

TheFoZ

Привет
Поле списка не будет естественным образом привязываться к этому типу списка, поскольку оно многомерно. Вы могли бы сделать что-нибудь с помощью DataTemplate для списка, но это будет нелегко.

Если бы вы структурировали немного по-другому, вы смогли бы получить то, что хотите

public class Person
{
    public string Name { get; set; }

    public List<string> subjects { get; set; } = new List<string>();

    public string SubjectList
    {
        get
        {
            StringBuilder subjects = new StringBuilder();

            foreach (string subject in Subjects)
            {
                subjects.Append($"{subject},");
            }

            return subjects.ToString().TrimEnd(',');
        }
    }

    public override string ToString()
    {
        return $"{Name} - {SubjectList}";
    }
}


Если у вас есть свой класс персон просто содержащий сведения об одном человеке то вы можете иметь коллекцию людей к которым привязан ваш список

public List<Person> Obj {get; set;}


По умолчанию, когда представление списка появляется для отображения объектов в этой коллекции, оно будет использовать ToString() для отображения текста.

Вы должны только что-то вроде этого, чтобы отобразить информацию
<ListBox Background="Gray"
               ItemSource="{Binding Obj}/>