我有一个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));
}
是否有某些原因导致该事件无法传播?
答案 0 :(得分:3)
将您的List<ModUserControl>
更改为ObservableCollection<ModUserControl>
。
答案 1 :(得分:2)
您的public List<ModUserControl> ModControls
可能应该是ObservableCollection<>
,因此您可以删除对OnPropertyChanged("ModControls");
的手动呼叫。您的ModControls
实际上没有改变。它仍然是同一个例子。