代码之家  ›  专栏  ›  技术社区  ›  Kirill Khod

WPF绑定到资源中的元素

  •  2
  • Kirill Khod  · 技术社区  · 7 年前

    我很难做出 ListBox 元素始终可见。

    我有 列表框 您可以选择的位置 DataGrid . 显示的名称绑定到 数据网格 Tag . 挑选出来的 数据网格 显示在下面。 数据网格 名称,或者更确切地说 标签 绑定到来自的数组 Content 班问题是 列表框 在选择图元之前,图元不可见,选择图元时,仅显示选定项目的名称。

    enter image description here

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

    这是我的代码:

    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));
            }
        }
    
    1 回复  |  直到 7 年前
        1
  •  6
  •   Mikael Koskinen    7 年前

    您可以通过定义 binding source for your resource .

    1. 给你的窗口起个名字。例如x:Name=MyWindow。
    2. 定义数据网格的绑定,使其源为MyWindow:

      Tag=“{绑定路径=DataContext.GridNames[0],源={x:引用MyWindow}}”

    结果:

    WPF binding source 下面是完整的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>