我不能为我的生活弄清楚为什么这不起作用。我有一个简化的Xaml片段,如下所示:
<UserControl x:Class="Foo.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008">
<Grid x:Name="LayoutRoot">
<ScrollViewer VerticalAlignment="Stretch"
Background="Black"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto" >
<ItemsControl x:Name="PictureItemsControl"
ItemsSource="{Binding Pics}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"
VerticalAlignment="Center"
HorizontalAlignment="Center" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<Image Source="{Binding Location}"
Height="200"
Width="200"
Stretch="UniformToFill" />
<TextBlock FontFamily="Verdana"
FontSize="16"
Foreground="White"
Text="{Binding Name}" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Grid>
</UserControl>
在我的MainPage.xaml的代码隐藏中,我有这个:
namespace Foo
{
public partial class MainPage : UserControl
{
public FooViewModel viewModel;
public MainPage()
{
InitializeComponent();
viewModel = new FooViewModel();
this.DataContext = viewModel;
}
}
}
我的ViewModel看起来像这样:
namespace Foo
{
public class FooViewModel:INotifyPropertyChanged
{
public ObservableCollection<Pic> Pics;
public FooViewModel()
{
Pics = new ObservableCollection<Pic>();
Pic.GetPics(Pics);
}
//More code here...
}
}
Pic只是一个简单的类,它有一些公共属性和一个静态方法,用一个可观察的集合填充测试数据。问题是我没有看到我的ItemsControl中发生任何绑定,除非我将此行添加到我的MainPage构造函数中:
PictureItemsControl.ItemsSource = viewModel.Pics;
如果我这样做,绑定工作。但这对我来说似乎不对。我在声明性绑定中遗漏了什么吗?
答案 0 :(得分:3)
您需要将“Pics”更改为属性,而不是字段。您不能直接数据绑定到字段。将图片更改为:
public ObservableCollection<Pic> Pics { get; private set; }
工作案例有效,因为您绑定了ViewModel,并间接绑定了Pics。
答案 1 :(得分:0)
是的,您需要在ItemsControl(ListBox,TabControl,ComboBox)上指定ItemsSource才能将数据绑定到它。