【问题标题】:Need to set DataContext of a UserControl from another UserControl both of which are on same WPF page需要从另一个 UserControl 设置 UserControl 的 DataContext 两者都在同一个 WPF 页面上
【发布时间】:2013-07-27 16:13:44
【问题描述】:

我的 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 的 Parent 表单,即 Owner 表单,然后找到 Personmanager 表单,最后设置它的数据上下文。我认为所有这些都需要在 BulkRegistration 表单上完成。我宁愿在 Window 上执行此操作,而不是在用户控件上执行此操作。

请提出建议。

【问题讨论】:

  • 您使用的是视图模型还是代码隐藏?
  • 我正在使用后面的代码。由于时间限制,尚未对 View Model 进行太多探索。
  • 如果您的主表单只有一个 ContentControl,并且根据您是否正在编辑,只需更改 ContentTemplate 怎么样?

标签: wpf data-binding


【解决方案1】:

您可以按照这些思路创建布局...

<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;
}

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

【讨论】:

    【解决方案2】:

    嗨,您可以通过像这样使用 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>
    

    我希望这会有所帮助。

    【讨论】:

    • "一旦用户点击编辑按钮..."
    • @ethicallogistics,我读到它是因为绑定应该发生在点击事件中,并且同一个点击事件应该处理第二个控件的“打开”。在您的解决方案中,没有点击处理程序,并且第二个控件始终可见。
    • 在 Click 事件中编写 Visibility 的逻辑,并让 DataContext 与我在回答中所做的相同。无需在Click Event中反复设置DataContext。
    • @ethicallogistics,如果在点击事件之前将数据上下文设置为其他内容怎么办?还是第一个控件的数据上下文没有静态声明?
    • 您希望第二个 UC 的 DataContext 与第一个相同。所以只需在绑定中执行它。如果您不将 DataContext 分配给 UC1,那么它将具有与 Window.Binding 相同的 dataContext 是动态的。意味着如果您的 UC1 的 DataContext 为空,那么 UC2 的 DataContext 将为空。每当您将 DataContext 分配给 Uc1 时,UC2 的 DataContext 将自动更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多