绑定无法正常使用ListBox

本文关键字:常使用 ListBox 绑定 | 更新日期: 2023-09-27 18:27:57

我正在将自定义类(实现INotifyPropertyChanged)的List绑定到ListBox中。

当我向列表中添加任何项目时,ListBox不会更新,但如果我滚动,ListBox会更新。

class MyClass : INotifyPropertyChanged
{
    private string name = string.Empty;
    public string Name { /* INotifyPropertyChanged */ }
}

属性

private List<MyClass> loaded;
public List<MyClass> Loaded { /* INorutyPropertyChanged */ }

列表框

<ListBox ItemsSource={Binding Loaded} />

如果我强制覆盖List属性,它可以正常工作:

Loaded = new List<MyClass>() { new MyClass { Name = "test"; } }

绑定无法正常使用ListBox

更新到:

public ObservableCollection<MyClass> Loaded { get; private set; }

<ListBox ItemsSource={Binding Loaded, UpdateSourceTrigger=PropertyChanged} />

此外,Loaded属性不需要使用INotiftyPropertyChanged。如果绑定发生一次,并且数据源没有更改,那么就没有必要了。

编辑:

下面是一个工作示例。

主窗口.xaml

<Window x:Class="WpfApplication3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ListBox Width="200" ItemsSource="{Binding Items, UpdateSourceTrigger=PropertyChanged}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Value}"/>
                </DataTemplate>
            </ListBox.ItemTemplate> 
        </ListBox>
        <Button Width="100" Height="75" HorizontalAlignment="Right" Content="Add" Command="{Binding AddItem}"/>
    </Grid>
</Window>

主窗口.xaml.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new DataContext();
    }
}

DataContext.cs

namespace WpfApplication3
{
    public class DataContext
    {
        public ObservableCollection<Item> Items { get; private set; }
        public ICommand AddItem { get; private set; }
        public DataContext()
        {
            Items = new ObservableCollection<Item>
            {
                new Item
                {
                    Value = "test"
                }
            };
            AddItem = new RelayCommand(() =>
            {
                Items.Add(new Item
                {
                    Value = "new item"
                });
            }, () => true);
        }
    }
    public class Item
    {
        public string Value { get; set; }
    }
}

RelayCommand.cs

public class RelayCommand : ICommand
{
    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }
    private Action methodToExecute;
    private Func<bool> canExecuteEvaluator;
    public RelayCommand(Action methodToExecute, Func<bool> canExecuteEvaluator)
    {
        this.methodToExecute = methodToExecute;
        this.canExecuteEvaluator = canExecuteEvaluator;
    }
    public RelayCommand(Action methodToExecute)
        : this(methodToExecute, null)
    {
    }
    public bool CanExecute(object parameter)
    {
        if (this.canExecuteEvaluator == null)
        {
            return true;
        }
        else
        {
            bool result = this.canExecuteEvaluator.Invoke();
            return result;
        }
    }
    public void Execute(object parameter)
    {
        this.methodToExecute.Invoke();
    }
}

如果你有任何问题,请告诉我。