以下情况:我有一个基类,它提供了一个与装饰者进行模态对话的小框架。
基类有一个DataTemplate类型的属性,它包含实际的输入方案(可能有各种输入)以及包含映射模型的对象属性(模板将模板绑定到输入值的模型类)
因为我想重复使用adorner,所以我让它有一个 ContentControl ,它有一个带有实际对话框设计的ContentTemplate。对话框的设计包含一个ContentControl,其Template与绑定器类中的属性绑定。当然,adorner的ContentControl的DataContext设置为自己。
现在,嵌入式ContentControl(在设计中)生成DataTemplate并显示(在当前情况下)TextBox。此TextBox现在应该绑定到模型。因此,我重复使用了adorner设计模板的DataContext作为实际的输入模板。这是我如何做到的:
装饰者的ControlTemplate
<Border Grid.Row="0" Background="{DynamicResource InputAdornerHeaderBackground}" BorderThickness="0,0,0,1" CornerRadius="0">
<TextBlock HorizontalAlignment="Stretch" VerticalAlignment="Stretch" TextWrapping="Wrap" Text="{Binding Header}"
FontSize="{DynamicResource InputAdornerHeaderFontSize}" Foreground="{DynamicResource InputAdornerHeaderForeground}"
FontWeight="{DynamicResource InputAdornerHeaderFontWeight}" Margin="8" />
</Border>
<Border Grid.Row="1" BorderThickness="1,0,1,1" BorderBrush="{DynamicResource InputAdornerBorderBrush}" CornerRadius="0">
<ContentControl ContentTemplate="{Binding InputControlTemplate}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
</Border>
</Grid>
</ContentTemplate>
实际输入模板(DataTemplate)
<DataTemplate x:Key="TextInputTemplate">
<Grid Background="Black" DataContext="{Binding DataContext.InputMapping, RelativeSource={RelativeSource AncestorType={x:Type ContentControl}}}">
<TextBox Text="{Binding Path=Text, Mode=OneWayToSource}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" BorderThickness="0"
adorners:InputAdorner.FocusElement="{Binding RelativeSource={RelativeSource Self}}" />
</Grid>
</DataTemplate>
模型类
public sealed class TextInputModel
{
public string Text { get; set; }
}
装饰属性
public DataTemplate InputControlTemplate
{
get { return _inputControlTemplate; }
private set
{
if (Equals(value, _inputControlTemplate)) return;
_inputControlTemplate = value;
OnPropertyChanged();
}
}
public object InputMapping
{
get { return _inputMapping; }
private set
{
if (Equals(value, _inputMapping)) return;
_inputMapping = value;
OnPropertyChanged();
}
}
仅供参考:正在创建Adorner时动态实例化模型。它没有设置两次。这必须是某种约束性问题。
模板显示正确。我看到并可以在文本框中输入内容,但是一旦我获取模型,所有属性都是默认的(“”)。它确实工作了一两次,但不知何故,设计变更显然使它失去了功能。
我不知道干扰的是什么,因为从我的观点来看,所有都应该正确设置。我检查了DataTemplate的上下文:它是实际的模型类。然而,文本框输入不会更新属性。
修改: 出于某种原因,似乎attatched属性导致了这个问题。但为什么会干扰?它不会覆盖DataContext,是吗?