ControlTemplate中的DataTemplate不更新Binding
我创建了一个带有3个PART_s的控件,一个PART_根据绑定的类型而改变,但是在Control中更改的值不会更新Binding,它似乎可以作为OneWay绑定使用。
以下是我相信的代码的一部分:
….
BooleanDAView DateTimeDAView Int32DAView StringDAView
对于内容我也尝试过… RelativeSource={RelativeSource AncestorType=local:DABaseControl}
但没有变化。
如果DataTemplate Binding使用"{Binding Path=Content, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"
则模板在设置后不会更改。
或者有更好的方法吗?
谢谢
我刚刚遇到同样的问题,我想用DataType="{x:Type sys:Boolean}
创建一个只有一个复选框的DataTemplate
。但是一路上有很多警告标志告诉我这不是应该的方式完成。
首先, {Binding}
的简单绑定会引发exception“ 双向绑定需要路径或xpath ”,这是第一个警告标志。 我将绑定更改为{Binding .}
,这有效(尽管这篇MSDN文章明确指出它们是等效的)。 伏都教帮助的事实是第二个警示标志。 然后它正确显示并且检查状态是根据布尔值,但是当单击复选框时(即使使用UpdateSourceTrigger=PropertyChanged
),它拒绝更新绑定源,无论我尝试了什么。 使用diagnostics:PresentationTraceSources.TraceLevel=High
显示它甚至没有尝试绑定(第三个警告标志)。
我继续为bool值创建了一个简单的“框” – 一个具有单个bool属性的类,其名称为Value
,带有INotifyPropertyChanged
实现。 我将绑定更改为{Binding Value}
,现在一切正常,包括双向绑定。
结论:似乎绑定不能更新绑定对象本身,而只是更新绑定对象的属性(这就是为什么{Binding}
抛出exception,但更明确的{Binding .}
抑制该exception,根据HB的回答 )。 无论如何,创建ViewModel并创建以其为目标的模板的方法似乎不仅仅是一个设计指南,而是一个实际的技术要求。
我实际上从未使用过ContentTemplateSelector
,但如果我不得不冒险猜测我会说它没有响应ContentControl.Content
属性上的PropertyChanged
事件,或者你的Content
绑定不正确。
您可以通过删除ContentTemplateSelector
并查看是否显示数据,轻松检查绑定是否正确。 如果是这样,您的绑定是正确的。 如果没有,则不正确,您需要修复它。
如果问题是ContentTemplateSelector
,那么我建议切换到DataTrigger
,它根据内容确定要使用的ContentTemplate
。 这是我通常做的,它使用一个只返回typeof(value)
的转换器