我创建了一个用户控件
<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而不是绑定到MyControlVM。我认为问题可能是因为内部文本框的绑定会比定义的控件(uc)先执行,因此uc的绑定DataContext尚未生效。
我想要实现的是:自定义控件(MyControl)将绑定到其对应的视图模型(MyControlVM),并且MyControl的内部元素将绑定到MyControlVM的属性。
您有解决这个问题的任何方案吗?
MyApp.MyControl
中执行类似于DataContext = this
的操作?此外,如果您不更改控件中的DataContext
,则{Binding TextContent}
应该就足够了。 - dkozlMyControlVM.DataContext
设置为MyControlVM
,由于它是通过可视树继承的,因此默认情况下,直到你更改它,里面的所有内容都将具有相同的DataContext
。在你的情况下,TextBlock
、Grid
和UserControl
将从外部设置为MyControlVM
,并具有相同的DataContext
。 - dkozl