繁体   English   中英

wpf 绑定到 selectedItem

[英]wpf binding to selectedItem

在我的示例中,我从 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中,每个项目都有一个用于绑定的DataContext,您可以将Stackpanel的DataContext设置为{Binding ElementName=ItemList, Path=SelectedItem}

然后只需将<TextBox Text="{Binding Age, UpdateSourceTrigger=PropertyChanged}"/>

在您想要的StackPanel内部;)

我们有这个 class:

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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM