我正在构建一个窗口,其中包含一组共享相同布局的行,但它们的内容应该不同,例如:
| (Label Content:)"Name1" | (Textbox Text)"SomeText" |
| (Label Content:)"Name5" | (Textbox Text)"OtherText" |
我已经定义了一个DataTemplate
,它基本上包含一个指定每列大小的网格,包含它需要的所有元素(一些标签,文本框等)并设置它们的公共属性。 / p>
<UserControl.Resources>
<DataTemplate x:Key="AxisRangeEntry" x:Shared="False">
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50" />
<ColumnDefinition Width="50" />
....
</Grid.ColumnDefinitions>
<Label x:Name="MyLabel" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center">
...
<TextBox x:Name="MyTextbox" Grid.Column="2" Width="110" HorizontalContentAlignment="Right" />
...
</Grid>
</DataTemplate>
</UserControl.Resources>
然后在我的窗口中,我开始将数据模板作为ContentControls添加到堆栈面板中:
<ContentControl ContentTemplate="{StaticResource AxisRangeEntry}" />
<ContentControl ContentTemplate="{StaticResource AxisRangeEntry}" />
....
我正在努力弄清楚如何定义DataTemplate
中可绑定的控件的某些属性,并在我开始定义{{1时将它们绑定到静态值/外部属性}}秒。实际上,每个ContentControl
都需要能够定义类似ContentControl
内容和MyLabel
文字的内容。
我以前创建了CustomControls,它们上面有MyTextbox
,然后我可以在另一个窗口上添加它们时绑定到它。使用DependencyProperties
但是我不确定如何将这些字段定义为可绑定并在包含新版本的模板时绑定它们。
任何帮助都将不胜感激。
答案 0 :(得分:0)
听起来,你没有使用MVVM模式。
根据您的情况,我建议使用MVVM - 看看这篇文章,快速介绍适合您案例的内容(带有ItemTemplate的ItemsControl)
您要做的是创建一个ObservableObject来表示每一行,然后将ObservableObjects的集合绑定到ItemsControl的ItemsSource,并将ItemTemplate设置为您创建的DataTemplate。在DataTemplate中,您将在ObservableObject的行上指定对该属性的每个绑定,并且WPF将绑定到每行的正确实例。
http://www.wpf-tutorial.com/list-controls/itemscontrol/
无论哪种方式,DataTemplates主要用于模板化某种数据类型。如果您确实需要以这种方式实现视图,那么可以使用具有依赖项属性的自定义UserControl。
答案 1 :(得分:0)
您呈现要绑定的项目的动态特性,因此此答案将尝试在参数集中提供指导。
... [来]定义的某些属性 DataTemplate中的控件可绑定到
{Binding}
将默认为数据上下文中的该项。如果绑定项具有特定属性,则使用{Binding MyPropertyName}
。只需验证父项或其祖先是否具有有效的数据上下文。并在我开始定义时将它们绑定到静态值/外部属性 ContentControls。
如果它位于自定义控件上,则使用命名绑定并将其绑定到控件上的属性。例如,控件的名称,x:Name="MyControl"
),在模板绑定中,可以直接指向它,例如
{Binding MyCustomControlDependencyProperty, ElementName=MyControl}
创建了CustomControls,它具有依赖属性
根据上述规则,我们仍然可以使用自定义控件的依赖属性来将消费者的信息传递给动态使用它的datatemplate。