我正在构建一个基于Sukram在CodeProject上的文章的图形设计师。现在,我正在尝试扩展它,使画布上的每个项目都绑定到不同的ViewModel对象 - 也就是为每个项目设置DataContext。
设计师上的每个项目实际上都是一个ContentControl,其中放置了不同的模板(基于拖放到画布上的工具箱项)。因此,我有一个包含TextBox的模板,以及一个包含Name属性的ViewModel对象,并将TextBox的Text属性绑定到ViewModel的Name属性上,但是...什么也没有发生。我使用Snoop检查了可视树,它确认了TextBox的DataContext是ViewModel对象。然而,TextBox仍然为空。如果我修改TextBox中的(空)文本,则ViewModel中的Name属性不会更改。因此,看起来绑定未被应用(或已被某种方式删除)。
我找到了一些帖子,它们谈论ContentControl如何处理DataContext和Content属性,但我不确定它们有多适用。代码如下设置ContentControl.Content:
Snoop显示TextBox具有DataContext,如果我深入该DataContext,可以看到它具有一个Name属性,其值为“Bob”。那么为什么TextBox仍然为空?尽管Snoop允许我更改该Name属性,但TextBox仍然为空。我做错了什么?
一些细节。我已将VS2010调试数据绑定选项设置为Verbose,这似乎显示了在设置DataContext之前就尝试了所有绑定。改变DataContext可能无法被识别,这是可能的吗?
我无法修复DataTemplate.LoadContent(),但我意识到我实际上并不需要DataTemplate,因为XamlWriter / XamlReader已经实例化了我需要的UI元素。我找到了一个解决方案,让XamlWriter编写所有绑定here,之后一切都正常工作了。
感谢您的帮助。
设计师上的每个项目实际上都是一个ContentControl,其中放置了不同的模板(基于拖放到画布上的工具箱项)。因此,我有一个包含TextBox的模板,以及一个包含Name属性的ViewModel对象,并将TextBox的Text属性绑定到ViewModel的Name属性上,但是...什么也没有发生。我使用Snoop检查了可视树,它确认了TextBox的DataContext是ViewModel对象。然而,TextBox仍然为空。如果我修改TextBox中的(空)文本,则ViewModel中的Name属性不会更改。因此,看起来绑定未被应用(或已被某种方式删除)。
我找到了一些帖子,它们谈论ContentControl如何处理DataContext和Content属性,但我不确定它们有多适用。代码如下设置ContentControl.Content:
newItem = new ContentControl();
ControlTemplate template = toolbox.GetTemplate();
UIElement element = template.LoadContent() as UIElement;
ViewModelItem viewModel = new ViewModelItem() { Name = "Bob" };
newItem.Content = element;
newItem.DataContext = viewModel;
而模板的 XAML 如下:
<ControlTemplate>
<Border BorderBrush="Black" BorderThickness="1" Width="100">
<TextBox Text={Binding Name}/>
</Border>
</ControlTemplate>
Snoop显示TextBox具有DataContext,如果我深入该DataContext,可以看到它具有一个Name属性,其值为“Bob”。那么为什么TextBox仍然为空?尽管Snoop允许我更改该Name属性,但TextBox仍然为空。我做错了什么?
一些细节。我已将VS2010调试数据绑定选项设置为Verbose,这似乎显示了在设置DataContext之前就尝试了所有绑定。改变DataContext可能无法被识别,这是可能的吗?
我刚刚发现了这篇文章 DataTemplate.LoadContent does not preserve bindings - 显然 DataTemplate.LoadContent 不会保留绑定。所以看起来我必须编写自己的 LoadContent() 版本。
我意识到模板经过 XamlWriter 处理后会剥离所有绑定,这对于解决问题没有帮助。
我无法修复DataTemplate.LoadContent(),但我意识到我实际上并不需要DataTemplate,因为XamlWriter / XamlReader已经实例化了我需要的UI元素。我找到了一个解决方案,让XamlWriter编写所有绑定here,之后一切都正常工作了。
感谢您的帮助。