【问题标题】:MVVM - ListBox SelectedItem Binding Property Going NullMVVM - ListBox SelectedItem 绑定属性变为空
【发布时间】:2011-02-24 11:25:13
【问题描述】:

所以我有一个列表框:

<ListBox x:Name="listbox" HorizontalAlignment="Left" Margin="8,8,0,8" Width="272" BorderBrush="{x:Null}" Background="{x:Null}" Foreground="{x:Null}" ItemsSource="{Binding MenuItems}" ItemTemplate="{DynamicResource MenuItemsTemplate}" SelectionChanged="ListBox_SelectionChanged" SelectedItem="{Binding SelectedItem}">

</ListBox>

我的视图模型中包含了这个:

    public ObservableCollection<MenuItem> MenuItems
    {
        get
        {
            return menuitems;
        }
        set
        {
            menuitems = value;
            NotifyPropertyChanged("MenuItems");
        }
    }
    public MenuItem SelectedItem
    {
        get
        {
            return selecteditem;
        }
        set
        {
            selecteditem = value;
            NotifyPropertyChanged("SelectedItem");
        }
    }

也在我的视图模型中:

    public void UpdateStyle()
    {
        ActiveHighlight = SelectedItem.HighlightColor;
        ActiveShadow = SelectedItem.ShadowColor;
    }

因此,目标是在触发 selectedchanged 事件时调用 UpdateStyle()。所以在.CS 文件中,我调用UpdateStyle()。 问题是,每当我进入 selectionchanged 事件方法时,我的 ViewModel.SelectedItem 始终为空。 我尝试调试它以查看绑定是否正常工作,并且确实如此。当我点击列表框中的一个项目时,SelectedItem Set 被触发,设置值......但介于两者之间的某个地方和选定的更改(在 CS 文件中)它被重置为 Null。

有人可以帮忙吗?

谢谢

编辑: 我想我可能会更清楚一点。 1. 单击列表中的一个项目 2. SelectedItem.Set 被触发,ViewModel.SeletedItem 被正确设置。 3. 在 .CS 文件中输入 OnSelectionChanged 事件。 4.进入ViewModel.UpdateStyle() 5. SelectedItem 抛出 Null 异常。

【问题讨论】:

标签: wpf mvvm binding listbox


【解决方案1】:

哇,发现一个奇怪的问题:

<Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource MainViewModelDataSource}}" d:DataContext="{d:DesignData /SampleData/MainViewModelSampleData.xaml}">

该代码是由 Expression Blend 生成的 - 它是导致问题的原因。我删除了所有生成的绑定,只是在 XAML 的构造函数中创建了 this.datacontext 一个新的 VM……现在它可以工作了。

还是谢谢各位。

【讨论】:

  • 该代码仅在设计时提供示例数据。它非常方便。我知道,因为我也删除了它来修复某些东西,然后后来才意识到它是什么,做了什么。您的代码隐藏中应该有设置运行时数据上下文的代码。
【解决方案2】:

查看您的支持属性 (selecteditem) 是否在代码中的某处设置为 NULL。

【讨论】:

  • Nope - SelectedItem 唯一被使用的地方是 UpdateStyle 和 Binding。
  • 我的意思是小写的selecteditem,在哪里设置的,和SelectedItem不一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 2010-12-26
  • 2011-01-02
  • 2020-09-01
相关资源
最近更新 更多