我制作了一个用户控件
<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)将绑定到其对应的viewmodel(MyControlVM),MyControl的内部元素将绑定到MyControlVM的属性。
你有解决这个问题的方法吗?
答案 0 :(得分:6)
如果我理解正确,您希望数据将MyControl
视图模型中的属性绑定到TextBox.Text
内的MyControl UserControl
属性。如果这是正确的,那么您可以使用RelativeSource Binding
或您已使用的ElementName
语法。
首先,确保您的视图模型设置为DataContext
的{{1}}:
UserControl
由于子控件会自动继承父对象的public MyControl()
{
DataContext = new YourControlViewModel();
}
对象,现在可以从DataContext
到TextBox
的XAML中的MyControl.DataContext
属性引用此视图模型:
UserControl
这就是你所需要的一切。
答案 1 :(得分:4)
默认情况下,每个控件都从其父控件继承其DataContext。因此,不需要明确地绑定它。
实际上,当您想要将控件的DataContext绑定到嵌套属性时,您必须指定:
<control:MyControl DataContext="{Binding Path=TextContent}"/>
答案 2 :(得分:3)
<TextBlock Text="{Binding Path=TextContent}"/>
在我的测试应用程序中适合我。
MainWindow.xaml
<Window x:Class="DataContextTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:my="clr-namespace:DataContextTest"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<my:MyOuterDataContext />
</Window.DataContext>
<Grid>
<my:MyControl DataContext="{Binding Path=MyInnerDataContext}" />
</Grid>
MyControl.xaml
<UserControl x:Class="DataContextTest.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"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<TextBlock Text="{Binding Path=TextContent}" />
</Grid>
DataContexts:
public class MyOuterDataContext
{
public MyInnerDataContext MyInnerDataContext { get; set; }
public MyOuterDataContext()
{
MyInnerDataContext = new MyInnerDataContext();
}
}
public class MyInnerDataContext
{
public string TextContent { get { return "foo"; } }
}