Good day to all!
The following code is available:
XAML:
<Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp1" xmlns:col="clr-namespace:System.Collections;assembly=mscorlib" mc:Ignorable="d" Title="MainWindow" Height="450" Width="525"> <Window.Resources> <col:ArrayList x:Key="dataGridDef"> <DataGrid Name="DG1" ItemsSource="{Binding Path=List1}" AutoGenerateColumns="False" Tag="{Binding Path=GridNames[0]}"> <DataGrid.Columns> <DataGridTextColumn Header="Grid1Name1" Binding="{Binding Path=Name1}"/> </DataGrid.Columns> </DataGrid> <DataGrid Name="DG2" ItemsSource="{Binding Path=List2}" AutoGenerateColumns="False" Tag="{Binding Path=GridNames[1]}"> <DataGrid.Columns> <DataGridTextColumn Header="Grid2Name1" Binding="{Binding Path=Name1}"/> </DataGrid.Columns> </DataGrid> </col:ArrayList> </Window.Resources> <StackPanel> <ListBox x:Name="lb" ItemsSource="{StaticResource dataGridDef}" DisplayMemberPath="Tag" SelectedValue="{Binding Path=SelectedGrid}"/> <ContentControl Content="{Binding ElementName=lb, Path=SelectedItem}"/> <TextBlock Height="100" Text="{Binding Path=Str.Header}"/> <TextBlock Text="{Binding Path=SelectedGrid.Tag}"/> </StackPanel> </Window> C #:
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = new Content(); } } public class Content { public ObservableCollection<Asd> List1 { get; set; } public ObservableCollection<Asd> List2 { get; set; } public DataGrid SelectedGrid { get; set; } private string[] _gridName; public string[] GridNames { get { return _gridName; } } public Content() { List1 = new ObservableCollection<Asd>(); List2 = new ObservableCollection<Asd>(); List1.Add(new Asd { Name1 = "1" }); List1.Add(new Asd { Name1 = "2" }); List2.Add(new Asd { Name1 = "a" }); List2.Add(new Asd { Name1 = "b" }); _gridName = new string[] { "G1", "G2" }; } } public class Asd: INotifyPropertyChanged { private string _name1; public string Name1 { get { return _name1; } set { if (value == _name1) return; _name1 = value; OnPropertyChanged(nameof(Name1)); } } public event PropertyChangedEventHandler PropertyChanged; internal void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } The task is as follows:
There is a ListBox in which the DataGrid is selected, the display name is tied to the DataGrid Tag property, the selected DataGrid displayed below, with which further and the work takes place. DataGrid names, or rather its Tag property, are bound to an array from the Content class. But! ListBox do not display names, as long as nothing is selected in it, as soon as an item is selected, only its name is displayed:
Accordingly, as soon as the second element is selected, the name of the second element is displayed, the name of the first element is no longer displayed.
How to make so that names of elements in ListBox always displayed?
