【问题标题】:Binding ListBox's ItemSource in XAML doesn't work在 XAML 中绑定 ListBox ItemSsource 不起作用
【发布时间】:2011-02-06 11:22:55
【问题描述】:

我有一个示例 windows phone 7 项目,我在其中测试了一些 MVVM 的东西,但是我遇到了一个问题。

我的代码如下所示:

这是来自我的主页面视图:

  <Grid>
        <ListBox x:Name="list" ItemsSource="{Binding _reviews}"/>
    </Grid>

这是视图的代码:

      public MainPage()
        {
            this.Loaded += MainPage_Loaded;
            // Line below makes list show what it is supposed to show
            // list.ItemsSource = (DataContext as MainPageVM)._reviews;
            DataContext = new MainPageVM();
            InitializeComponent();
        }

        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            // DataContext is set to the right object!
            var obj = list.DataContext;
        }

ViewModel 代码

class MainPageVM
{
    public ObservableCollection<Review> _reviews { get; set; }

    public MainPageVM()
    {
        _reviews = GetReviews();
    }

    private ObservableCollection<Review> GetReviews()
    {
        ObservableCollection<Review> reviews = new ObservableCollection<Review>();
        reviews.Add(new Review() { User = "Lol", Text = "Cool", Country = "UK"});
        reviews.Add(new Review() { User = "misterX", Text = "aWESCOM APP", Country = "USA"});
        reviews.Add(new Review() { User = "meYou", Text = "The best", Country = "UK"});

        return reviews;
    }

这是我的模型:

class Review
{
    public string Text { get; set; }
    public string User { get; set; }
    public string Country { get; set; }
}

您能否指出错误在哪里以及为什么我能够在后面的代码中设置 ItemSource,但不能通过 XAML 中的绑定来设置

【问题讨论】:

  • 我唯一需要添加的是publicclass Review。除此之外,ItemsSource 绑定工作正常。如果您使用您在此处发布的代码创建一个新项目,是否能够重现此问题?
  • 我创建了新项目,代码与我发布的完全相同(公开了 Review 类),但它仍然不起作用。
  • 好的,我上传了我的示例项目。如果你试试这个,你会遇到同样的问题吗? mediafire.com/?4r4n4lazau242mm
  • 除了一个关键字,完全一样!我错过了 ViewModel 类的公开声明。将其设置为公开可以解决问题。你知道为什么必须公开 ViewModel 吗?

标签: windows data-binding mvvm windows-phone-7 itemssource


【解决方案1】:

问题是你的视图模型类没有实现INotifyPropertyChanged接口并且你没有引发PropertyChanged事件,所以视图不知道你绑定的属性已经改变了。

如果您不确定如何实现此接口,请查看this post on Silverlight Show

更新:对于大多数属性,以上是正确的,但是,在这种情况下,因为它是ObservableCollection,所以没有必要。但是,由于您的视图模型类不是公开的,因此视图无法绑定到它。您在调试时是否在“输出”窗口中看到任何绑定错误?

【讨论】:

  • 我没有绑定到我的模型的特定属性,因此它不需要实现 INotifyPropertyChnaged 并且 ObservableCollection 具有通知机制。还是我错过了你的意思?
  • _reviews 是您要绑定的属性。实际上,因为它是一个ObservableCollection,所以您不需要为该属性实现INotifyPropertyChanged 接口,但您需要将视图模型类公开,以便视图可以绑定到它。
  • 是的,我刚刚想通了。您知道将其公开的原因是什么,因为据我所知,默认情况下类是内部的,并且可以被同一程序集中的其他类访问。和 WPF 依赖属性系统有关吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 2015-11-16
  • 1970-01-01
  • 2014-06-13
  • 2012-02-18
  • 2020-05-16
相关资源
最近更新 更多