Tho*_*Lee 4 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>
Run Code Online (Sandbox Code Playgroud)
我希望定义的控件(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}"/>
Run Code Online (Sandbox Code Playgroud)
分配给窗口的DataContext具有以下结构:WindowVM.MyControlVM.TextContent.
给定的代码不起作用,因为文本框的DataContext被绑定到WindowVM.我认为问题可能是因为内部文本框在定义的控件(uc)之前被绑定,因此uc的有界DataContext 尚未生效.
我想要的是:自定义控件(MyControl)将绑定到其对应的viewmodel(MyControlVM),MyControl的内部元素将绑定到MyControlVM的属性.
你对这个问题有什么解决方案吗?
如果我理解正确,您希望数据将MyControl视图模型中的TextBox.Text属性绑定到内部的属性MyControl UserControl.如果这是正确的,那么您可以使用a RelativeSource Binding或ElementName您已经使用的语法.
首先,请确保您的视图模型设置为DataContext为UserControl:
public MyControl()
{
DataContext = new YourControlViewModel();
}
Run Code Online (Sandbox Code Playgroud)
当子控件自动继承其父DataContext对象时,您现在可以从XAML中TextBox通过MyControl.DataContext属性引用此视图模型UserControl:
<TextBlock Text="{Binding DataContext.TextContent,
RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
Run Code Online (Sandbox Code Playgroud)
这就是你所需要的.