我有这个用户控件XAML:
<Window x:Class="MyProj.Dialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:shell="http://schemas.microsoft.com/winfx/2006/xaml/presentation/shell"
mc:Ignorable="d">
<Grid>
<ItemsControl ItemsSource="{Binding Foos}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="ASd" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</Window>
以及相应的代码:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media.Effects;
using System.Windows.Threading;
namespace MyProj
{
public partial class Dialog : Window
{
public Dialog() : base()
{
InitializeComponent();
//DataContext = this;
}
public ObservableCollection<string> Foos = new ObservableCollection<string> { "foo", "bar" };
}
}
我遇到的问题是由于某种原因ItemsControl
没有显示任何内容。奇怪的是,我甚至没有在输出中收到绑定警告。
答案 0 :(得分:5)
在WPF中,绑定的Path
组件只能引用属性(或属性路径),而不能引用字段。尝试将您的集合封装在属性中:
private ObservableCollection<string> foos =
new ObservableCollection<string> { "foo", "bar" };
public ObservableCollection<string> Foos
{
get { return foos; }
}
此外,您需要取消注释设置DataContext
的行:
DataContext = this;
答案 1 :(得分:3)
您还可以绑定字段(如果您命名组件,则最简单,但您需要以某种方式引用它):
<ItemsControl ItemsSource="{Binding}" Name="myItems">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
带
private ObservableCollection<string> Foos =
new ObservableCollection<string> { "foo", "bar" };
public Dialog() : base
{
InitializeComponent();
myItems.DataContext = Foos;
}
这比在XAML中对绑定进行硬编码更灵活,因为您没有绑定到类的特定属性,而是绑定到暴露正确属性的任何对象。假设您有许多集合,只需通过(以编程方式)将其DataContext更改为您希望显示的任何集合,即可轻松地在ItemsControl中显示它们中的任何集合。