[英]Binding inside XAML UserControl template body
I've got a UserControl
that I'm using to create a simple CardView like you would find in the DevExpress toolkit.我有一个
UserControl
,我用它来创建一个简单的 CardView,就像您在 DevExpress 工具包中找到的一样。 It consists of just a header and a body.它仅由一个 header 和一个主体组成。 The body is a
<ContentPresenter/>
that binds to the control's Body
dependency property. body 是一个绑定到控件的
Body
依赖属性的<ContentPresenter/>
。
Here is the XAML for the UserControl
这是
UserControl
的 XAML
<UserControl x:Class="TwinAxis.UI.WPF.Controls.CardControl"
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"
xmlns:local="clr-namespace:TwinAxis.UI.WPF.Controls"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<UserControl.Resources>
<Style TargetType="TextBlock" x:Key="SensorStateLabelStyle">
<Setter Property="FontSize" Value="18" />
</Style>
<Style x:Key="CardHeader" TargetType="Border" BasedOn="{StaticResource HeaderStyle}">
<Setter Property="Height" Value="35" />
</Style>
</UserControl.Resources>
<Grid x:Name="LayoutRoot">
<Border BorderBrush="DarkSlateGray" BorderThickness="1" Background="White">
<Border.BitmapEffect>
<DropShadowBitmapEffect Color="{StaticResource WindowsMediaMainColor}"
ShadowDepth="3"
Direction="315"
Softness="0.45"
Opacity="0.75"/>
</Border.BitmapEffect>
</Border>
<Border>
<DockPanel>
<Border DockPanel.Dock="Top" Style="{StaticResource CardHeader}">
<TextBlock Style="{StaticResource HeaderText}"
DockPanel.Dock="Top"
Padding="5"
Text="{Binding Header}" />
</Border>
<ScrollViewer HorizontalScrollBarVisibility="Auto"
Padding="5"
VerticalScrollBarVisibility="Auto">
<ContentPresenter Content="{Binding Body}" />
</ScrollViewer>
</DockPanel>
</Border>
</Grid>
</UserControl>
The CardControl.xaml.cs code behind CardControl.xaml.cs 代码在后面
public partial class CardControl : UserControl {
public static readonly DependencyProperty BodyProperty =
DependencyProperty.Register(nameof(Body), typeof(object), typeof(CardControl), new PropertyMetadata());
public static readonly DependencyProperty HeaderProperty =
DependencyProperty.Register(nameof(Header), typeof(string), typeof(CardControl), new PropertyMetadata());
public CardControl() {
InitializeComponent();
LayoutRoot.DataContext = this;
}
public object Body {
get => GetValue(BodyProperty);
set => SetValue(BodyProperty, value);
}
public string Header {
get => (string)GetValue(HeaderProperty);
set => SetValue(HeaderProperty, value);
}
}
If I use it like below it works perfectly fine如果我像下面这样使用它,它工作得很好
<!-- Works -->
<ctrl:CardControl Header="Test">
<ctrl:CardControl.Body>
<Grid><!-- XAML inside grid --></Grid>
</ctrl:CardControl.Body>
</ctrl:CardControl>
<!-- Nothing in the body even though I have data templates setup properly -->
<ctrl:CardControl Header="Test">
<ctrl:CardControl.Body>
<ContentPresenter Content="{Binding MachineViewModel}" />
</ctrl:CardControl.Body>
</ctrl:CardControl>
Thanks to @Clemens and @ASh in the comments I was able to fix the issue by moving all of that "template" code where it belongs in a <Style />
tag for the UserControl's Template
property.感谢评论中的@Clemens 和@ASh,我能够通过将所有“模板”代码移动到 UserControl 的
Template
属性的<Style />
标记中它所属的位置来解决这个问题。 I also removed the forced isolated DataContext
that was mentioned in the comments and I'm now able to fill out the content of the CardControl and have it render like I wanted.我还删除了评论中提到的强制隔离
DataContext
,现在我可以填写 CardControl 的内容并让它按我想要的方式呈现。
<UserControl x:Class="TwinAxis.UI.WPF.Controls.CardControl"
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"
xmlns:local="clr-namespace:TwinAxis.UI.WPF.Controls"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<UserControl.Resources>
<Style TargetType="TextBlock" x:Key="SensorStateLabelStyle">
<Setter Property="FontSize" Value="18" />
</Style>
<Style x:Key="CardHeader" TargetType="Border" BasedOn="{StaticResource HeaderStyle}">
<Setter Property="Height" Value="35" />
</Style>
<Style TargetType="local:CardControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:CardControl">
<Grid>
<Border BorderBrush="DarkSlateGray" BorderThickness="1" Background="White">
<Border.BitmapEffect>
<DropShadowBitmapEffect Color="{StaticResource WindowsMediaMainColor}"
ShadowDepth="3"
Direction="315"
Softness="0.45"
Opacity="0.75"/>
</Border.BitmapEffect>
</Border>
<Border>
<DockPanel>
<Border DockPanel.Dock="Top" Style="{StaticResource CardHeader}">
<TextBlock Style="{StaticResource HeaderText}"
DockPanel.Dock="Top"
Padding="5"
Text="{TemplateBinding Header}" />
</Border>
<ScrollViewer HorizontalScrollBarVisibility="Auto"
Padding="5"
VerticalScrollBarVisibility="Auto">
<ContentPresenter Content="{TemplateBinding Content}"/>
</ScrollViewer>
</DockPanel>
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
</UserControl>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.