需要从另一个UserControl设置UserControl的DataContext,这两个UserControl都在同一个WPF页面上

时间:2013-07-27 16:13:44

标签: wpf data-binding

我的WPF表单正在使用多个用户控件。这些代表了独特的形式我需要提供导航类功能。

用户点击UserControl A上的EDIT按钮后,我想绑定UserControl B的DataContext并在主表单上打开此用户控件。

此主表单包含用户控件。我怎么能这样做?

这就是我的代码的样子

<Window>
        <TabControl  Background="Transparent">
            <TabItem Header="View Registration" Background="Transparent">
                <my:BulkPersonRegistration x:Name="BulkPersonRegistrationForm" />
            </TabItem>
            <TabItem Header="Add/Update Person" Background="Transparent">
                <my:PersonManager x:Name="PersonManagerForm" />
            </TabItem>
        </TabControl>
</Window>

BulkPersonRegistration用户控件调用数据绑定函数以显示数据网格。绑定数据网格后,每行后都会出现编辑按钮。当用户单击编辑按钮时,我希望PersonManager表单被编辑行的对象绑定。 问题是,BulkPersonRegistration表单不知道PersonManagerForm。因此,我需要一种方法来找出BulkPersonRegistration的父表单,即所有者表单,然后找到Personmanager表单,最后设置它的数据上下文。我认为所有这些都需要在BulkRegistration表单上完成。我宁愿在Window而不是用户控制上这样做。

请建议。

2 个答案:

答案 0 :(得分:0)

您可以沿着这些线创建布局......

<DockPanel>
    <Button DockPanel.Dock="Top" 
            Content ="EDIT" 
            Height="30" 
            Width="150"
            Click="ButtonBase_OnClick"
            />
    <TextBlock DockPanel.Dock="Top" Name="Control1" DataContext="{Binding}" Background="Yellow"/>
    <TextBlock DockPanel.Dock="Top" Name="Control2" Visibility="Collapsed" Background="Green"/>
    <Rectangle DockPanel.Dock="Top"></Rectangle>
</DockPanel>

在点击处理程序中,您可以设置第二个控件的数据上下文...

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
    Control2.DataContext = Control1.DataContext;
    Control2.Visibility = Visibility.Visible;
}

此代码段使第二个控件可见,并使第一个控件与第二个控件共享其数据上下文。您实际上可以将控件的数据上下文设置为任何内容,但此代码段假定它是相同的数据上下文。设置控件的可见性将使其“打开”。

答案 1 :(得分:0)

您好您只需使用 ElementName 绑定

即可实现此目的
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <local:UserControl1 x:Name="uc1"/>
    <local:UserControl2 Grid.Row="1" DataContext="{Binding DataContext, ElementName=uc1}"/>
</Grid>

我希望这会有所帮助。