c# - WPF 绑定(bind)内部控件与父数据上下文

标签 c# wpf binding user-controls

我做了一个用户控件

<UserControl x:Class="MyApp.MyControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d"  x:Name="uc">
<Grid Width="Auto" Height="Auto">
    <TextBlock Text="{Binding Path=DataContext.TextContent, ElementName=uc}"/>
    <TextBlock Text="{Binding Path=DataContext.TextContent2, ElementName=uc}"/>
</Grid>

我希望定义的控件 (uc) 中的子控件将绑定(bind)到 uc.DataContext 的属性。我使用定义的控件如下:

<Window x:Class="Tms.TMSClient.Views.MainWindow" Name="window"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:control="clr-namespace:MyApp"
    xmlns:ribbon="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary">      

    <control:MyControl DataContext="{Binding Path=MyControlVM}"/>

分配给窗口的 DataContext 具有以下结构:WindowVM.MyControlVM.TextContent。

给定的代码不起作用,因为文本框的 DataContext 绑定(bind)到 WindowVM。我认为问题可能是因为内部文本框在定义的控件 (uc) 之前绑定(bind),因此 uc 的绑定(bind) DataContext 尚未生效。

我想要的是:自定义控件(MyControl)将绑定(bind)到其对应的 View 模型(MyControlVM),而MyControl的内部元素将绑定(bind)到MyControlVM的属性。

你有解决这个问题的方法吗?

最佳答案

如果我没理解错的话,你想对 MyControl 中的属性进行数据绑定(bind)查看模型到 TextBox.Text MyControl UserControl 内的属性(property).如果这是正确的,那么您可以使用 RelativeSource Binding ,或 ElementName您已经在使用的语法。

首先,确保您的 View 模型设置为 DataContext对于 UserControl :

public MyControl()
{
    DataContext = new YourControlViewModel();
}

作为子控件自动继承其父控件的 DataContext对象,您现在可以从 TextBox 引用此 View 模型通过MyControl.DataContext来自 UserControl 的属性(property)的 XAML:

<TextBlock Text="{Binding DataContext.TextContent, 
    RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />

这就是您所需要的。

关于c# - WPF 绑定(bind)内部控件与父数据上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26548065/

相关文章:

wpf - 意外删除了 Xaml 文件的隐藏代码。如何再次添加后面的代码?

wpf - ObservableCollection 中的项目不更新 View

c# - 如何在 unity/C# 中检测时钟是否设置为 12 小时或 24 小时时间格式?

c# - 在单元测试的开关案例中的特定情况下,如何仅调用一个函数?

c# - 如何根据方法返回启用/禁用 WPF 按钮

c# - 多个左外连接与 lambda 表达式

wpf - 从 ResourceDictionary 中绑定(bind)到祖先

wpf - 如何确保所有模型都可以访问服务代理?

java - 在 Spring 2.5 中使用基于注释的 Controller 形成绑定(bind) HashMap

listview - 如何在 Xamarin Forms 中的可重用 ViewCell 中绑定(bind)命令?