WPF 数据绑定未更新 UI
WPF Databinding Not Updating UI
我有一个 XAML 和 UserControl 的 CS 文件。我将数据存储在实现 INotifyPropertyChanged 的 Singleton class 中,并绑定到 UserControl 中的 ListBox。
这是 XAML 数据绑定:
<ListBox Name="ModsListBox"
ItemsSource="{Binding ModControls}"
Visibility="Visible"
Width="350"
Height="Auto">
</ListBox>
数据上下文在 CS 文件中设置如下:
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));
}
事件不会传播的原因是什么?
您的 public List<ModUserControl> ModControls
可能应该是 ObservableCollection<>
,这样您就可以删除对 OnPropertyChanged("ModControls");
的手动调用。您的 ModControls
实际上并没有改变。它仍然是同一个实例。
将您的 List<ModUserControl>
更改为 ObservableCollection<ModUserControl>
。
我有一个 XAML 和 UserControl 的 CS 文件。我将数据存储在实现 INotifyPropertyChanged 的 Singleton class 中,并绑定到 UserControl 中的 ListBox。
这是 XAML 数据绑定:
<ListBox Name="ModsListBox"
ItemsSource="{Binding ModControls}"
Visibility="Visible"
Width="350"
Height="Auto">
</ListBox>
数据上下文在 CS 文件中设置如下:
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));
}
事件不会传播的原因是什么?
您的 public List<ModUserControl> ModControls
可能应该是 ObservableCollection<>
,这样您就可以删除对 OnPropertyChanged("ModControls");
的手动调用。您的 ModControls
实际上并没有改变。它仍然是同一个实例。
将您的 List<ModUserControl>
更改为 ObservableCollection<ModUserControl>
。