【问题标题】:How to bind a property in itemtemplate to a proptery in itemsource?如何将 itemtemplate 中的属性绑定到 itemssource 中的属性?
【发布时间】:2011-05-22 21:31:34
【问题描述】:

考虑这个容器:

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 中的属性?或者我最终想要完成的事情有替代方法吗?

谢谢!

【问题讨论】:

  • 我认为这可能是因为您试图同时设置x:NameName。请参阅下面的编辑。

标签: wpf listview wpf-controls binding observablecollection


【解决方案1】:

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

Name = "{Binding Name}"

Data = "{Binding DataValues}"

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


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

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

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

【讨论】:

  • 嗯,对不起,我很着急。实际上,在此处发布此内容时,绑定语法是一个错字,我确实定义了依赖属性。
  • Name={Binding Path=Name}Name={Binding Name} 是等价的。见msdn.microsoft.com/en-us/library/cc189022(v=vs.95).aspx
  • Noup,删除“x:Name”没有帮助。我也尝试过这样做:{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListViewItem}}, Path=Name} 但这也行不通..
  • 嗯。也许尝试将 ItemInfoUserControl 中的 DependencyProperty 的名称从“Name”更改为“ControlName”?可能存在某种冲突,因为 Name 已经定义...
  • 你有它的工作吗?您能否提供一个工作示例以便我可以区分它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 2011-11-10
  • 2013-10-09
  • 2018-08-27
  • 2012-01-08
  • 1970-01-01
相关资源
最近更新 更多