考虑这个容器:
public class ItemInfo : DependencyObject
{
public string Name { get; set; }
public ObservableCollection<SomeDataItem> DataValues { get; set; }
...
Dependency object registration and event handling
...
}
public class MyItemSource : ObservableCollection<ItemInfo>
{
...
}
现在,我希望在列表视图中显示此数据,其中显示该项目的控件是自定义的。为此,我将MyItemSource设置为listview的ItemSource并定义一个ItemTemplate。但是,我似乎无法访问ItemTemplate中的ItemInfo。这是我的XAML:
<Grid>
<ListBox ItemsSource="{StaticResource MyStaticDataSource}"
Grid.IsSharedSizeScope="True">
<ListBox.ItemTemplate>
<DataTemplate>
<local:ItemInfoUserControl x:Name="itemInfoUserControl"
Name = "{Binding Name}" <--- this doesn't work
Data = "{Binding DataValues}" <--- this doesn't work
Width="300" Height="200"
Grid.Row="1">
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
它不是绑定到ItemSource的ItemInfo,而是绑定到ItemInfoUserControl属性,这不是我希望它做的。有没有办法将itemtemplate中的属性绑定到itemsource中的属性?或者是否有另一种方法来解决我最终要完成的事情?
谢谢!
答案 0 :(得分:1)
首先,您需要使用正确的binding syntax:
Name = "{Binding Name}"
和
Data = "{Binding DataValues}"
而不只是“Name = "Binding Name"
”和“Data = "Binding DataValues"
”。请注意在绑定表达式周围添加“{
”和“}
”
只要Name
中的DataValues
和DependencyProperties
为ItemInfoUserControl
,这可能足以解决您的问题。如果没有,您需要将它们实现为DependencyProperties
,以便能够在XAML中绑定它们。有关定义自定义依赖项属性的MSDN文章,请参阅here。
修改:此外,您刚刚注意到 - 您同时设置了x:Name
和Name
。来自MSDN上的this article:
如果Name可用作类的属性,则Name和x:Name可以互换使用作为属性,但如果在同一元素上指定了两者,则会产生解析异常。如果XAML是标记编译的,则标记编译将发生异常,否则它将在加载时发生。
删除x:Name="itemInfoUserControl"
并查看是否有帮助。