- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 xaml 中构造对象时,DataContext 似乎大多数时候都能正确解析,但直接在附加属性的范围内构造同一对象似乎会阻止 DataContext 继承。
在这方面,有几个娱乐事件所需的定义。我很乐意展示代码,但为了简洁起见,这里是大纲:
ViewModel
,其属性 ViewModel.MyProperty
类型字符串设置为 "123456789abc"
class FrameworkObject : FrameworkElement
- 没有定义 UI,但有一个 DataContext。这个对象有一个定义的依赖属性,string FrameworkObject.MyDependencyProperty
AttachedProperty.FrameworkObject
,它采用 FrameworkObject
类型的对象创建对象作为可视化树中的元素成功绑定(bind)值
<!--
System.Windows.Data Warning: 56 : Created BindingExpression (hash=52203868) for Binding (hash=27504314)
System.Windows.Data Warning: 58 : Path: 'MyProperty'
System.Windows.Data Warning: 60 : BindingExpression (hash=52203868): Default mode resolved to OneWay
System.Windows.Data Warning: 61 : BindingExpression (hash=52203868): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 62 : BindingExpression (hash=52203868): Attach to StackOverflowExamples.FrameworkObject.MyProperty (hash=34181910)
System.Windows.Data Warning: 67 : BindingExpression (hash=52203868): Resolving source
System.Windows.Data Warning: 70 : BindingExpression (hash=52203868): Found data context element: FrameworkObject (hash=34181910) (OK)
System.Windows.Data Warning: 78 : BindingExpression (hash=52203868): Activate with root item ViewModel (hash=66824994)
System.Windows.Data Warning: 108 : BindingExpression (hash=52203868): At level 0 - for ViewModel.MyProperty found accessor RuntimePropertyInfo(MyProperty)
System.Windows.Data Warning: 104 : BindingExpression (hash=52203868): Replace item at level 0 with ViewModel (hash=66824994), using accessor RuntimePropertyInfo(MyProperty)
System.Windows.Data Warning: 101 : BindingExpression (hash=52203868): GetValue at level 0 from ViewModel (hash=66824994) using RuntimePropertyInfo(MyProperty): '123456789abc'
System.Windows.Data Warning: 80 : BindingExpression (hash=52203868): TransferValue - got raw value '123456789abc'
System.Windows.Data Warning: 89 : BindingExpression (hash=52203868): TransferValue - using final value '123456789abc'
-->
<local:FrameworkObject x:Name="CreatedInPanel" MyDependencyProperty="{Binding MyProperty, diag:PresentationTraceSources.TraceLevel=High}" />
<TextBlock local:AttachedProperty.FrameworkObject="{Binding Path='', ElementName=CreatedInPanel}" Style="{StaticResource DisplayFromAttached}" />
在 TextBlock 范围内创建对象无法正确绑定(bind)
<!--
System.Windows.Data Warning: 56 : Created BindingExpression (hash=53517805) for Binding (hash=3663598)
System.Windows.Data Warning: 58 : Path: 'MyProperty'
System.Windows.Data Warning: 60 : BindingExpression (hash=53517805): Default mode resolved to OneWay
System.Windows.Data Warning: 61 : BindingExpression (hash=53517805): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 62 : BindingExpression (hash=53517805): Attach to StackOverflowExamples.FrameworkObject.MyProperty (hash=51442863)
System.Windows.Data Warning: 67 : BindingExpression (hash=53517805): Resolving source
System.Windows.Data Warning: 70 : BindingExpression (hash=53517805): Found data context element: FrameworkObject (hash=51442863) (OK)
System.Windows.Data Warning: 71 : BindingExpression (hash=53517805): DataContext is null
System.Windows.Data Warning: 65 : BindingExpression (hash=53517805): Resolve source deferred
System.Windows.Data Warning: 67 : BindingExpression (hash=53517805): Resolving source
System.Windows.Data Warning: 70 : BindingExpression (hash=53517805): Found data context element: FrameworkObject (hash=51442863) (OK)
System.Windows.Data Warning: 71 : BindingExpression (hash=53517805): DataContext is null
System.Windows.Data Warning: 67 : BindingExpression (hash=53517805): Resolving source
System.Windows.Data Warning: 70 : BindingExpression (hash=53517805): Found data context element: FrameworkObject (hash=51442863) (OK)
System.Windows.Data Warning: 71 : BindingExpression (hash=53517805): DataContext is null
System.Windows.Data Warning: 67 : BindingExpression (hash=53517805): Resolving source
System.Windows.Data Warning: 70 : BindingExpression (hash=53517805): Found data context element: FrameworkObject (hash=51442863) (OK)
System.Windows.Data Warning: 71 : BindingExpression (hash=53517805): DataContext is null
System.Windows.Data Warning: 67 : BindingExpression (hash=53517805): Resolving source (last chance)
System.Windows.Data Warning: 70 : BindingExpression (hash=53517805): Found data context element: FrameworkObject (hash=51442863) (OK)
System.Windows.Data Warning: 78 : BindingExpression (hash=53517805): Activate with root item <null>
System.Windows.Data Warning: 106 : BindingExpression (hash=53517805): Item at level 0 is null - no accessor
System.Windows.Data Warning: 80 : BindingExpression (hash=53517805): TransferValue - got raw value {DependencyProperty.UnsetValue}
System.Windows.Data Warning: 88 : BindingExpression (hash=53517805): TransferValue - using fallback/default value ''
System.Windows.Data Warning: 89 : BindingExpression (hash=53517805): TransferValue - using final value ''
-->
<TextBlock Style="{StaticResource DisplayFromAttached}">
<local:AttachedProperty.FrameworkObject>
<local:FrameworkObject x:Name="CreatedInScope" MyDependencyProperty="{Binding MyProperty, diag:PresentationTraceSources.TraceLevel=High}" />
</local:AttachedProperty.FrameworkObject>
</TextBlock>
使用数据代理将解析绑定(bind),即使是在控件范围内创建也是如此
<!--
System.Windows.Data Warning: 56 : Created BindingExpression (hash=6968762) for Binding (hash=14964341)
System.Windows.Data Warning: 58 : Path: 'DataContext.MyProperty'
System.Windows.Data Warning: 60 : BindingExpression (hash=6968762): Default mode resolved to OneWay
System.Windows.Data Warning: 61 : BindingExpression (hash=6968762): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 62 : BindingExpression (hash=6968762): Attach to StackOverflowExamples.FrameworkObject.MyProperty (hash=47145209)
System.Windows.Data Warning: 67 : BindingExpression (hash=6968762): Resolving source
System.Windows.Data Warning: 70 : BindingExpression (hash=6968762): Found data context element: <null> (OK)
System.Windows.Data Warning: 78 : BindingExpression (hash=6968762): Activate with root item FrameworkElement (hash=339559)
System.Windows.Data Warning: 108 : BindingExpression (hash=6968762): At level 0 - for FrameworkElement.DataContext found accessor DependencyProperty(DataContext)
System.Windows.Data Warning: 104 : BindingExpression (hash=6968762): Replace item at level 0 with FrameworkElement (hash=339559), using accessor DependencyProperty(DataContext)
System.Windows.Data Warning: 101 : BindingExpression (hash=6968762): GetValue at level 0 from FrameworkElement (hash=339559) using DependencyProperty(DataContext): <null>
System.Windows.Data Warning: 106 : BindingExpression (hash=6968762): Item at level 1 is null - no accessor
System.Windows.Data Warning: 80 : BindingExpression (hash=6968762): TransferValue - got raw value {DependencyProperty.UnsetValue}
System.Windows.Data Warning: 88 : BindingExpression (hash=6968762): TransferValue - using fallback/default value ''
System.Windows.Data Warning: 89 : BindingExpression (hash=6968762): TransferValue - using final value ''
System.Windows.Data Warning: 96 : BindingExpression (hash=6968762): Got PropertyChanged event from FrameworkElement (hash=339559) for DataContext
System.Windows.Data Warning: 101 : BindingExpression (hash=6968762): GetValue at level 0 from FrameworkElement (hash=339559) using DependencyProperty(DataContext): ViewModel (hash=66824994)
System.Windows.Data Warning: 108 : BindingExpression (hash=6968762): At level 1 - for ViewModel.MyProperty found accessor RuntimePropertyInfo(MyProperty)
System.Windows.Data Warning: 104 : BindingExpression (hash=6968762): Replace item at level 1 with ViewModel (hash=66824994), using accessor RuntimePropertyInfo(MyProperty)
System.Windows.Data Warning: 101 : BindingExpression (hash=6968762): GetValue at level 1 from ViewModel (hash=66824994) using RuntimePropertyInfo(MyProperty): '123456789abc'
System.Windows.Data Warning: 80 : BindingExpression (hash=6968762): TransferValue - got raw value '123456789abc'
System.Windows.Data Warning: 89 : BindingExpression (hash=6968762): TransferValue - using final value '123456789abc'
-->
<ContentControl Content="{StaticResource DataProxy}" Visibility="Collapsed" />
<TextBlock Style="{StaticResource DisplayFromAttached}">
<local:AttachedProperty.FrameworkObject>
<local:FrameworkObject x:Name="DataProxyBinding" MyDependencyProperty="{Binding DataContext.MyProperty, Source={StaticResource DataProxy}, diag:PresentationTraceSources.TraceLevel=High}" />
</local:AttachedProperty.FrameworkObject>
</TextBlock>
最让我困惑的是。在 ContentControl.Content
中构建 FrameworkObject
似乎可以很好地绑定(bind)
<!--
System.Windows.Data Warning: 56 : Created BindingExpression (hash=63642613) for Binding (hash=38750844)
System.Windows.Data Warning: 58 : Path: 'MyProperty'
System.Windows.Data Warning: 60 : BindingExpression (hash=63642613): Default mode resolved to OneWay
System.Windows.Data Warning: 61 : BindingExpression (hash=63642613): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 62 : BindingExpression (hash=63642613): Attach to StackOverflowExamples.FrameworkObject.MyProperty (hash=16347077)
System.Windows.Data Warning: 67 : BindingExpression (hash=63642613): Resolving source
System.Windows.Data Warning: 70 : BindingExpression (hash=63642613): Found data context element: FrameworkObject (hash=16347077) (OK)
System.Windows.Data Warning: 78 : BindingExpression (hash=63642613): Activate with root item ViewModel (hash=66824994)
System.Windows.Data Warning: 108 : BindingExpression (hash=63642613): At level 0 - for ViewModel.MyProperty found accessor RuntimePropertyInfo(MyProperty)
System.Windows.Data Warning: 104 : BindingExpression (hash=63642613): Replace item at level 0 with ViewModel (hash=66824994), using accessor RuntimePropertyInfo(MyProperty)
System.Windows.Data Warning: 101 : BindingExpression (hash=63642613): GetValue at level 0 from ViewModel (hash=66824994) using RuntimePropertyInfo(MyProperty): '123456789abc'
System.Windows.Data Warning: 80 : BindingExpression (hash=63642613): TransferValue - got raw value '123456789abc'
System.Windows.Data Warning: 89 : BindingExpression (hash=63642613): TransferValue - using final value '123456789abc'
-->
<ContentControl x:Name="ImplicitContent">
<ContentControl.Template>
<ControlTemplate TargetType="ContentControl">
<TextBlock local:AttachedProperty.FrameworkObject="{TemplateBinding Content}" Style="{StaticResource DisplayFromAttached}" />
</ControlTemplate>
</ContentControl.Template>
<local:FrameworkObject MyDependencyProperty="{Binding MyProperty, diag:PresentationTraceSources.TraceLevel=High}" />
</ContentControl>
通过这个,我使用了一种样式,DisplayFromAttached
,它可以在封闭面板的资源字典中找到并定义如下:
<Style x:Key="DisplayFromAttached" TargetType="TextBlock">
<Setter Property="Text" Value="{Binding Path=(local:AttachedProperty.FrameworkObject).MyDependencyProperty, RelativeSource={RelativeSource Self}}" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=(local:AttachedProperty.FrameworkObject).MyDependencyProperty, RelativeSource={RelativeSource Self}}" Value="">
<Setter Property="Text" Value="No value found" />
</DataTrigger>
</Style.Triggers>
</Style>
为什么 DataContext 无法继承到直接构造为附加属性的对象?
最佳答案
为什么会这样?
让我们记住 FrameworkElement.DataContext
是作为带有继承标志的 DependencyProperty
实现的(参见代码源 here,第 2704 行),因此,“继承”您正在谈论的 DataContext
是根据 documented inheritance rules 发生的:
Property value inheritance enables child elements in a tree of elements to obtain the value of a particular property from parent elements.
Property value inheritance is particularly about how property values can inherit from one element to another on the basis of the parent-child relationships within a tree of elements
在您的情况下,您的 TextBlock
与其 AttachedProperty.FrameworkObject
值之间没有这种父子关系,这不是 WPF 意义上的。它是附加属性还是非依赖属性这一事实实际上并没有影响。
对您的尝试的一些评论
Creating the object as an element in the Visual Tree successfully binds the value
是的,因为对象继承了与 TextBlock
相同的 DataContext
,因为它们在元素树中具有相同的父级。
Creating the object within the scope of the TextBlock fails to bind properly
是的,因为 TextBlock
不是元素树中对象的父级。 TextBlock
恰好包含对该对象的引用(我在这里隐藏了附加属性的复杂性)。
Using a data proxy will resolve the binding even when created in a control's scope
是的,因为该对象是 ContentControl
的子对象,它本身是具有正确 DataContext
的元素的子对象。
And the most confusing to me. Constructing the FrameworkObject within a ContentControl.Content seems to bind perfectly fine.
同上。
如果你真的需要你的对象在你的第二种情况下有一个DataContext
,你必须自己设置它,因为它不会自然继承:
<TextBlock x:Name="textBlock" Style="{StaticResource DisplayFromAttached}">
<local:AttachedProperty.FrameworkObject>
<local:FrameworkObject DataContext="{Binding ElementName=textBlock, Path=DataContext}" x:Name="CreatedInScope" MyDependencyProperty="{Binding MyProperty, diag:PresentationTraceSources.TraceLevel=High}" />
</local:AttachedProperty.FrameworkObject>
</TextBlock>
关于c# - 为什么 DataContext 无法继承构造为附加属性的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60079072/
我在我的项目中添加了一个 LinqToSQL 类并将它放在我的 App_code 文件夹中。 然后,我将 LinqDataSource 添加到新网页并尝试将其配置为使用此类,但它并未在 DataCon
在我的带有 EF6 的 MVC 5 应用程序中开始使用接口(interface)和 Ninject 并遇到了问题。 我调用多个实现来获取数据,当保存它时,实体断开连接并且存在多对多和类似问题。 所以我
因此,我在我的 View 模型中保留了一个对象 NewMyItem 作为负责在列表中添加新项目的控件的 DataContext。每当执行 AddCommand 时,我都会重置该对象,以便它可以添加另一
这个问题与我之前在这里的问题有关:Predicate won't validate parameter correctly 首先是关于我的模型的一些信息: 基础 View 模型: public abs
我正在尝试使用数据绑定(bind)将 ObservableCollection 绑定(bind)到 DataGrid 的 ItemsSource,因为我了解了 WPF 和其他东西。 在代码隐藏中,我可
使用 Linq-to-Sql 时,Visual Studio 会为您创建一个 DataContext 类。我想知道什么时候实例化这个上下文,在我的一个项目中,我使用了一个 DataContext 实例
我有一个包含控件的窗口。 该控件有一个设置为 DataContext 对象的 View 模型。 Window 对象有自己的 ViewModel 设置为 DataContext。 如果我在 Window
您好,我正在尝试制作一个带有 PathData 的自定义按钮。到目前为止,我已经设法查看了其中的路径。但是我的 Button 没有接受 MVVM 命令。 自定义按钮 XAML
我对MVVM特别陌生。 我有以下XAML代码:
我在使用 linq to sql 进行 asp.net c# Web 应用程序的 DataContexts 时遇到一些问题。 我首先遇到了抛出异常的问题,因为我没有处理 DataContext,与 t
作为问题的延续Linking DataContext with another property in WPF . 在研究的最后,我非常惊讶地发现,当有人写下这样的东西时: Content 属性所绑
这应该很容易,但它会引发 VS2008 的严重循环。 我正在尝试使用 MVVM 的 WPF,尽管我已经开发了大约 15 年,并且有一个比较,但我还是一个新手。科学。程度。在当前客户端,我需要使用 VB
我在这样的后台线程中为 wpf 窗口获取数据 [framework 4.0 with async/await]: async void refresh() { // returns objec
当心,这是一个相当基本的问题(我认为)。 我有一个名为 MyUserControl 的 UserControl。我在我的 ListBox 的 DataTemplate 中使用它: 现在我想在 MyU
我有一个应用程序需要将来自多个数据库的表连接到单个 LINQ-to-SQL 查询中。不幸的是,我为每个数据库设置了一个单独的 DataContext 类,因此该查询将不起作用。我收到这样的错误:“查询
是否可以通过 XAML 将一些数据传递到绑定(bind)源/数据上下文? 在我的特定情况下,我希望为绑定(bind)源提供对创建它的窗口的引用。 例如:
我一直在查看 MSDN 文章 WPF Apps With The Model-View-ViewModel Design Pattern . 上面的文章展示了他是如何使用DataTemplate 来显
我使用 VS 2008 中的 ORM 设计了我的数据库。 将其导出到 SQL Server 以便在 SQL Server 上创建表和关系的最佳方法是什么? 谢谢, 京东 最佳答案 如果您使用的是 LI
我在 C#、WPF 中有以下代码: base.DataContext = new DataTemplate[] { new Da
我有一个以这种方式在父控件中使用的 UserControl: 父控件 DataContext 是一个包含 SelectedEntity 属性的 ViewModel。 在我的子 UserControl
我是一名优秀的程序员,十分优秀!