wpf binding to selectedItem

本文关键字:selectedItem to binding wpf | 更新日期: 2023-09-27 18:29:13

在我的示例中,我绑定到ListBox中的selectedItem。我想知道如何在堆栈面板中设置绑定,这样我就不必单独绑定到每个控件。

我可以只绑定堆栈面板,然后像这样绑定子控件吗?(伪代码)

<StackPanel Grid.Column="2" Content="{Binding SelectedItem.Name, ElementName=ItemList}"/>
    <TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}"/>
    <TextBox Text="{Binding Kids, UpdateSourceTrigger=PropertyChanged}"/>
    <TextBox Text="{Binding Age, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel>

代码

<ListBox Grid.Column="0" 
                 x:Name="ItemList"
                 Background="AliceBlue" 
                 ItemsSource="{Binding VNodes}" 
                 SelectedItem="{Binding SelectedVNode, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <WrapPanel>
                        <TextBlock Text="Name: " />
                        <TextBlock Text="{Binding Name}" FontWeight="Bold" />
                    </WrapPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Stretch" />
        <StackPanel Grid.Column="2">
            <TextBox Text="{Binding SelectedItem.Name, ElementName=ItemList, UpdateSourceTrigger=PropertyChanged}"/>
            <TextBox Text="{Binding SelectedItem.Kids, ElementName=ItemList, UpdateSourceTrigger=PropertyChanged}"/>
            <TextBox Text="{Binding SelectedItem.Age, ElementName=ItemList, UpdateSourceTrigger=PropertyChanged}"/>
        </StackPanel>

wpf binding to selectedItem

在WPF中,每个Item都有一个绑定的DataContext,您可以将Stackpanel的DataContext设置为{Binding ElementName=ItemList, Path=SelectedItem}

简单地说<TextBox Text="{Binding Age, UpdateSourceTrigger=PropertyChanged}"/>

根据需要在StackPanel中;)

我们有这个类:

public class Jobs
    {
        public string Name { get; set; }
        public List<string> Titles { get; set; }
    }

MainViewModel(你需要制作2个属性(填充这些道具的随机值):

 public MainViewModel()
        {
            ListJobs = new List<Jobs>();
            ListJobs.Add(new Jobs() { Name = "Job1", Titles = new List<string>() {"Job1Title1","Job1Title2","Job1Title3" } });
            ListJobs.Add(new Jobs() { Name = "Job2", Titles = new List<string>() {"Job2Title1","Job2Title2","Job2Title3" } });
            ListJobs.Add(new Jobs() { Name = "Job3", Titles = new List<string>() {"Job3Title1","Job3Title2","Job3Title3" } });
        }
 private List<Jobs> listJobs;
        public List<Jobs> ListJobs
        {
            get { return listJobs; }
            set
            {
                if (value != listJobs)
                {
                    listJobs = value;
                    OnPropertyChanged(nameof(ListJobs));
                }
            }
        }

        private Jobs selectedJob;
        public Jobs SelectedJob
        {   
            get { return selectedJob; }
            set
            {
                if (value != selectedJob)
                {
                    selectedJob = value;
                    OnPropertyChanged(nameof(SelectedJob));
                }
            }
        }

XAML:

 <Window.DataContext>
        <local:MainViewModel/>
    </Window.DataContext>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <DataGrid x:Name="Jobs" Grid.Column="0" AutoGenerateColumns="False" SelectedItem="{Binding SelectedJob, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding ListJobs, UpdateSourceTrigger=PropertyChanged}">
            <DataGrid.Columns >
                <DataGridTextColumn Binding="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}" Header="Job" Width="200*"  IsReadOnly="False"/>
            </DataGrid.Columns>
        </DataGrid>
        <DataGrid x:Name="JobTitles" Grid.Column="1" AutoGenerateColumns="False" ItemsSource="{Binding SelectedJob.Titles, UpdateSourceTrigger=PropertyChanged}">
            <DataGrid.Columns >
                <DataGridTextColumn Header="JobTitle" Width="200*" IsReadOnly="False" Binding="{Binding}"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>