Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 继承的DataContext-绑定不起作用_C#_Wpf_Binding_Datatemplate - Fatal编程技术网

C# 继承的DataContext-绑定不起作用

C# 继承的DataContext-绑定不起作用,c#,wpf,binding,datatemplate,C#,Wpf,Binding,Datatemplate,以下情况:我得到了一个基类,它提供了一个小框架,用于使用装饰器创建模态对话框 <Border Grid.Row="0" Background="{DynamicResource InputAdornerHeaderBackground}" BorderThickness="0,0,0,1" CornerRadius="0"> <TextBlock HorizontalAlignment="Stretch" VerticalAlignmen

以下情况:我得到了一个基类,它提供了一个小框架,用于使用装饰器创建模态对话框

        <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类型的属性,它包含实际的输入方案(所有类型的输入都是可能的),还有一个object属性,它包含映射模型(模板将其输入值绑定到的模型类)

        <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>
因为我想重用装饰器,所以我让它有一个ContentControl,anon有一个实际对话框设计的ContentTemplate。对话框的设计包含一个ContentControl,其模板绑定到adorner类中的属性。当然,装饰器ContentControl的DataContext设置为自身

        <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>
现在,嵌入式ContentControl(在设计中)生成DataTemplate并显示(在当前情况下)一个文本框。此文本框现在应绑定到模型。因此,我将adorner设计模板的DataContext重新用于实际的输入模板。我是这样做的:

        <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>
装饰器的控件模板

        <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>
装饰器属性

        <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>
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();
        }
    }
仅供参考:在创建装饰器时,将动态实例化模型。它不会被设置两次。这一定是一个有约束力的问题

        <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>
模板显示正确。我看到并可以在文本框中输入内容,但一旦我获取模型,所有属性都是默认的(“”)。它确实工作了一两次,但不知何故,设计上的改变显然使它失去了功能

        <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的上下文:它是实际的模型类。但是,文本框输入不会更新属性

        <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>
编辑
出于某种原因,似乎是附加的属性导致了此问题。但它为什么要干预?它不会覆盖DataContext,是吗?

而且它总是以最简单的方式失败:UpdateSourceTrigger。当然,这个默认设置为“FocusLost”,因为文本框不会失去焦点,所以它永远不会更新。很难确定它何时随机设置为nothing或(“”)。而且它总是以最简单的方式失败:UpdateSourceTrigger。当然,这个默认设置为“FocusLost”,因为文本框不会失去焦点,所以它永远不会更新。当它随机设置为nothing或(“”)时,很难发现。
        <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>