WPF数据绑定未更新UI

时间:2016-03-15 18:57:15

标签: c# wpf xaml data-binding wpf-controls

我有一个UserControl的XAML和CS文件。我将我的数据存储在Singleton类中,该类实现了INotifyPropertyChanged,它绑定到UserControl中的ListBox。

这是XAML数据绑定:

<ListBox Name="ModsListBox"
    ItemsSource="{Binding ModControls}"
    Visibility="Visible"
    Width="350"
    Height="Auto">
</ListBox>

正在CS文件中设置datacontext,如下所示:

DataContext = ModDirector.Instance;
InitializeComponent();

在代码中有一个添加元素的方法,这些元素添加了被绑定的数据结构,然后调用OnPropertyChanged(),但UI永远不会更新。

    /// <summary>
    /// Adds a mod and sends event to update UI elements bound to ModContols
    /// </summary>
    /// <param name="modUserControl"></param>
    /// <param name="index"></param>
    public void AddMod(ModUserControl modUserControl, int? index = null)
    {
        if (index != null)
        {
            _modControls.Insert(index.Value, modUserControl);
        }
        else
        {
            _modControls.Add(modUserControl);
        }
        OnPropertyChanged("ModControls");
    }

这里完成的是它所绑定的财产:

/* Properties */
    public List<ModUserControl> ModControls
    {
        get { return _modControls; }
        set
        {
            _modControls = value;
            OnPropertyChanged();
        }
    }
    /* End Properties */

OnPropertyChanged的代码

/// <summary>
    /// Fires PropertyChanged event notifying the UI elements bound
    /// </summary>
    /// <param name="propertyName"></param>
    [NotifyPropertyChangedInvocator]
    private void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }

是否有某些原因导致该事件无法传播?

2 个答案:

答案 0 :(得分:3)

将您的List<ModUserControl>更改为ObservableCollection<ModUserControl>

答案 1 :(得分:2)

您的public List<ModUserControl> ModControls可能应该是ObservableCollection<>,因此您可以删除对OnPropertyChanged("ModControls");的手动呼叫。您的ModControls实际上没有改变。它仍然是同一个例子。