继承的DataContext - 绑定不起作用

时间:2016-02-05 14:19:51

标签: c# wpf binding datatemplate

以下情况:我有一个基类,它提供了一个与装饰者进行模态对话的小框架。

基类有一个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,是吗?

0 个答案:

没有答案