WPF 绑定到资源中的元素

Kir*_*hod 2 c# wpf xaml datagrid listbox

我无法让ListBox元素始终可见。

我有ListBox你可以选择的地方DataGrid。显示名称绑定到DataGrid Tag. 选择DataGrid显示如下。DataGrid名称,或者更确切地说,它Tag绑定到Content类中的数组。问题是ListBox元素在您选择之前是不可见的,当您选择它们​​时,只会显示所选项目的名称。

在此处输入图片说明

当我选择第二个元素时,第一个不再显示,反之亦然。

这是我的代码:

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>
Run Code Online (Sandbox Code Playgroud)

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));
        }
    }
Run Code Online (Sandbox Code Playgroud)

Mik*_*nen 5

您可以通过为您的资源定义绑定源来解决该问题。

  1. 为您的窗口命名。例如 x:Name=MyWindow。
  2. 定义数据网格的绑定,以便它们的源是 MyWindow:

    Tag="{Binding Path=DataContext.GridNames[0], Source={x:Reference MyWindow}}"

结果:

WPF 绑定源 这是完整的 XAML:

<Window x:Class="WpfApp6.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:WpfApp6"
    xmlns:collections="clr-namespace:System.Collections;assembly=mscorlib"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525" x:Name="MyWindow">
<Window.Resources>
    <collections:ArrayList x:Key="dataGridDef">
        <DataGrid Name="DG1" ItemsSource="{Binding Path=List1}" AutoGenerateColumns="False" Tag="{Binding Path=DataContext.GridNames[0], Source={x:Reference MyWindow}}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Grid1Name1" Binding="{Binding Path=Name1}"/>
            </DataGrid.Columns>
        </DataGrid>
        <DataGrid Name="DG2" ItemsSource="{Binding Path=List2}"  AutoGenerateColumns="False" Tag="{Binding Path=DataContext.GridNames[1], Source={x:Reference MyWindow}}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Grid2Name1" Binding="{Binding Path=Name1}"/>
            </DataGrid.Columns>
        </DataGrid>
    </collections:ArrayList>
</Window.Resources>
<StackPanel>
    <ListBox x:Name="lb" ItemsSource="{StaticResource dataGridDef}" DisplayMemberPath="Tag" SelectedValue="{Binding Path=SelectedGrid, Mode=TwoWay}"/>
    <ContentControl Content="{Binding ElementName=lb, Path=SelectedItem}"/>
    <TextBlock Height="100" Text="{Binding Path=Str.Header}"/>
    <TextBlock Text="{Binding Path=SelectedGrid.Tag}"/>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)