【发布时间】:2014-12-20 07:12:19
【问题描述】:
我做了一个用户控件
<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)中的子控件将绑定到 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 已绑定到 WindowVM。我认为问题可能是因为内部文本框是在定义的控件(uc)之前绑定的,因此 uc 的有界 DataContext 尚未生效。
我想要的是:自定义控件(MyControl)将绑定到其对应的视图模型(MyControlVM),而MyControl的内部元素将绑定到MyControlVM的属性。
你有解决这个问题的办法吗?
【问题讨论】:
-
您是否有机会在
MyApp.MyControl中执行DataContext = this之类的操作?另外,如果你不改变DataContext控制{Binding TextContent}应该足够了 -
您将
MyControlVM.DataContext设置为MyControlVM,并且由于它是通过可视化树继承的,因此默认情况下以及在您更改之前,它内部的所有内容都将具有DataContext。在您的情况下,TextBlock、Grid和UserControl将具有相同的DataContext从外部设置为MyControlVM
标签: c# wpf binding user-controls