强制依赖 属性 刷新
Force dependency property to refresh
我想强制绑定我的列表框以刷新其内容。
我的列表框绑定到依赖项 属性:
<ListBox ... DataContext="{Binding ElementName=_this}" ItemsSource="{Binding Path=MyList}"/>
我想刷新列表框的内容,例如,当我按下一个按钮以调用 DependencyProperty MyList get 时。
您可以将 MyList 设为 ObservableCollection, or something else which implements INotifyCollectionChanged
然后如果您更改了 MyList 的内容,ListBox 将自动更新
在这种情况下,您甚至不需要将 MyList
声明为依赖项 属性。一个简单的只读 属性 就足够了:
public ObservableCollection<MyItem> MyList { get; }
= new ObservableCollection<MyItem>();
使用 ObservableCollection
作为要在列表框中显示的项目的容器。这将在添加或删除项目时自动触发控件刷新。
由于您现在不再需要创建新集合(只需刷新其内容),因此您可以为此使用常规 C# 属性。
就个人而言,我会将其抽象出来
private ObservableCollection<MyItem> _mylist = new ObservableCollection<MyItem>();
public IEnumerable<MyItem> MyList => _mylist;
刷新列表...
_myList.Clear();
_mylist.Add( ... );
控件仍会更新,因为它检测到 MyList 实现了 INotifyCollectionChanged,即使它只是声明为 IEnumerable。
您永远不应将 DependencyProperty 用于数据绑定源 - 常规 属性,结合 INotifyPropertyChanged 是更新其值的任何属性的首选方式。查看 MVVM 模式,将其作为将用户界面与代码的其余部分分开的一种方式。
我想强制绑定我的列表框以刷新其内容。 我的列表框绑定到依赖项 属性:
<ListBox ... DataContext="{Binding ElementName=_this}" ItemsSource="{Binding Path=MyList}"/>
我想刷新列表框的内容,例如,当我按下一个按钮以调用 DependencyProperty MyList get 时。
您可以将 MyList 设为 ObservableCollection, or something else which implements INotifyCollectionChanged
然后如果您更改了 MyList 的内容,ListBox 将自动更新
在这种情况下,您甚至不需要将 MyList
声明为依赖项 属性。一个简单的只读 属性 就足够了:
public ObservableCollection<MyItem> MyList { get; }
= new ObservableCollection<MyItem>();
使用 ObservableCollection
作为要在列表框中显示的项目的容器。这将在添加或删除项目时自动触发控件刷新。
由于您现在不再需要创建新集合(只需刷新其内容),因此您可以为此使用常规 C# 属性。
就个人而言,我会将其抽象出来
private ObservableCollection<MyItem> _mylist = new ObservableCollection<MyItem>();
public IEnumerable<MyItem> MyList => _mylist;
刷新列表...
_myList.Clear();
_mylist.Add( ... );
控件仍会更新,因为它检测到 MyList 实现了 INotifyCollectionChanged,即使它只是声明为 IEnumerable。
您永远不应将 DependencyProperty 用于数据绑定源 - 常规 属性,结合 INotifyPropertyChanged 是更新其值的任何属性的首选方式。查看 MVVM 模式,将其作为将用户界面与代码的其余部分分开的一种方式。