如何将itemtemplate中的属性绑定到itemsource中的proptery?

时间:2010-12-09 14:11:52

标签: wpf listview wpf-controls binding observablecollection

考虑这个容器:

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中的属性?或者是否有另一种方法来解决我最终要完成的事情?

谢谢!

1 个答案:

答案 0 :(得分:1)

首先,您需要使用正确的binding syntax

Name = "{Binding Name}"

Data = "{Binding DataValues}"

而不只是“Name = "Binding Name"”和“Data = "Binding DataValues"”。请注意在绑定表达式周围添加“{”和“}” 只要Name中的DataValuesDependencyPropertiesItemInfoUserControl,这可能足以解决您的问题。如果没有,您需要将它们实现为DependencyProperties,以便能够在XAML中绑定它们。有关定义自定义依赖项属性的MSDN文章,请参阅here


修改:此外,您刚刚注意到 - 您同时设置了x:NameName。来自MSDN上的this article

  

如果Name可用作类的属性,则Name和x:Name可以互换使用作为属性,但如果在同一元素上指定了两者,则会产生解析异常。如果XAML是标记编译的,则标记编译将发生异常,否则它将在加载时发生。

删除x:Name="itemInfoUserControl"并查看是否有帮助。