Возможно ли привязка Dictionary с внутренним списком ObservableCollection к элементу listbox ? или это можно сделать проще. В данном примере привязки не корректны.
Пояснение: 1)Listbox x:Name="List_dir": отвечает за показ ключей словаря; 2)ListView x:Name="List_dir2" Отвечает за вывод списка(ObservableCollection) по ключу.
Предполагаемый функционал: Создание ключей; Добавление данных в существующий список по ключу; Удаление данных из списка по ключу\Изменение данных из списка по ключу; Поиск ключей в Listbox x:Name="List_dir"
public class mySelectedItem
{
public string Name { get; set; }
public string Password { get; set; }
public string Description { get; set; }
public mySelectedItem(string name, string password,string description)
{
Name = name;
Password = password;
Description = description;
}
}
Dictionary<string, ObservableCollection<mySelectedItem>> dict1 = new Dictionary<string, ObservableCollection<mySelectedItem>>();
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
dict1.Add("f1", new ObservableCollection<mySelectedItem>());
dict1["f1"].Add(new mySelectedItem("log1","pas1","desc1"));
dict1["f1"].Add(new mySelectedItem("log2","pas2","desc2"));
}
XAML:
<ListBox x:Name="List_dir" HorizontalAlignment="Stretch" Grid.Row="0" VerticalAlignment="Stretch" Background="White" Margin="-1,-1,0,-1" ItemsSource="{Binding dict1}" BorderBrush="White" >
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image Source="icon/f1.png" MaxWidth="20" MaxHeight="20" Margin="0,0,5,0"/>
<TextBlock Text="{Binding Key}" FontFamily="Segoe UI Black" FontSize="14"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<ListView x:Name="List2_dir" ItemsSource="{Binding Asset.dict1.Values}" HorizontalAlignment="Stretch" SelectionChanged="ListView_SelectionChanged" Background="{x:Null}" BorderBrush="{x:Null}" Foreground="Red">
<ListView.Resources>
<ContextMenu x:Key="ItemContextMenu">
<MenuItem x:Name="menuItem_CopyUsername" Click="menuItem_CopyUsername_Click" Header="Copy Username">
<MenuItem.Icon>
<Image Source="icon/def.png" />
</MenuItem.Icon>
</MenuItem>
<MenuItem x:Name="menuItem_CopyPassword" Click="menuItem_CopyPassword_Click" Header="Copy Password">
<MenuItem.Icon>
<Image Source="icon/def.png" />
</MenuItem.Icon>
</MenuItem>
<Separator />
<MenuItem x:Name="menuItem_DeleteCreds" Click="menuItem_DeleteCreds_Click" Header="Delete">
<MenuItem.Icon>
<Image Source="icon/def.png" />
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
</ListView.Resources>
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="ContextMenu" Value="{StaticResource ItemContextMenu}" />
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView AllowsColumnReorder="true">
<GridViewColumn DisplayMemberBinding="{Binding Path=Name}" Header="Логин" Width="150"/>
<GridViewColumn DisplayMemberBinding="{Binding Path=Password}" Header="Пароль" Width="150"/>
<GridViewColumn DisplayMemberBinding="{Binding Path=Description}" Header="Описание" Width="200"/>
</GridView>
</ListView.View>
</ListView>

Суть: При выборе itema- это не суть, это хотелка. Суть - это то, зачем все это нужно. И именно ее в вашем вопросе не хватает, чтобы понять, как это можно реализовать. Что содержит ключ словаря? Вангую, что тоже самое, что и свойствоName? Если так, то у вас ошибка проектирования - данные не должны дублироваться. Если нет, то расскажите, что к чему: что делает или должен делать ваш код/приложение? – aepot Feb 14 '21 at 23:50ObservableCollectionотListотличается? – aepot Feb 15 '21 at 06:31public ObservableCollection<KeyValueCollection> Models { get; set; } = new ObservableCollection<KeyValueCollection>();– Tand Feb 16 '21 at 11:06{ public string Name { get; set; } public ObservableCollection<Model> Data_list { get; set; } public KeyValueCollection() { Data_list = new ObservableCollection<Model>(); } }```– Tand Feb 16 '21 at 11:06Models.Add(new KeyValueCollection { Name = "asdfg" }); var item = Models.FirstOrDefault(i => i.Name == "asdfg"); if (item != null) { item.Data_list.Add(new Model { Name = "Folder", Login = "Folder", Password = "Folder", Description = "Folder" }); }– Tand Feb 16 '21 at 11:18ObservableCollectionреализуетINotifyCollectionChanged, что позволяет автоматически, без вашего участия, обновить интерфейс при добавлении/удалении объекта. – EvgeniyZ Feb 16 '21 at 11:51Но как привязать все это дело- опять же, ссылка выше, где вы можете увидеть, что уListBoxнадо задатьIsSynchronizedWithCurrentItem="True", это позволит синхронизировать другие элементы с тем, что выбрано в нем, ну и соотстветственно его надо привязать (ItemsSource = "{Binding dict1}"(или в случае вашего комментарияItemsSource = "{Binding Models}"), далее ему надо переопределитьListBox.ItemTemplate, задав там нужный вид отображения (в случае словаря будет{Binding Key}, а в случае коллекции{Binding Name}). – EvgeniyZ Feb 16 '21 at 12:00ListView, который мы привязываем таким образом в случае словаря:ItemsSource = "{Binding dict1/Value}", в случае коллекции:ItemsSource = "{Binding dict1/Data_list}". Обратите внимание на/, через нее какраз и задается дальше свойство для синхронизации, то есть левая часть должна быть идентична той, что вы указывали уListBox, а правая должна указывать на свойство для привязки (в вашем случае коллекция). Все, вот вы и привязали в пару строк кода все данные, вид только не забудьте указать дляListViewнужный. Если что не ясно, то читайте дубликат, внимательней! – EvgeniyZ Feb 16 '21 at 12:05