我可以声明性地将ItemsContol.ItemsSource绑定到Silverlight中的ObservableCollection吗?

时间:2009-11-02 23:38:53

标签: silverlight data-binding xaml mvvm

我不能为我的生活弄清楚为什么这不起作用。我有一个简化的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;

如果我这样做,绑定工作。但这对我来说似乎不对。我在声明性绑定中遗漏了什么吗?

2 个答案:

答案 0 :(得分:3)

您需要将“Pics”更改为属性,而不是字段。您不能直接数据绑定到字段。将图片更改为:

public ObservableCollection<Pic> Pics { get; private set; }

工作案例有效,因为您绑定了ViewModel,并间接绑定了Pics。

答案 1 :(得分:0)

是的,您需要在ItemsControl(ListBox,TabControl,ComboBox)上指定ItemsSource才能将数据绑定到它。