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)的转换器