带有 ObservableCollection 源的 TreeView,没有更新
TreeView with ObservableCollection Source, no update
我创建了一个绑定到 ObservableCollection 的简单 Treeview。
ObservableCollection<IMarketDataViewModel> MarketDataItems;
public interface IMarketDataViewModel
{
string Title { get; }
ObservableCollection<IMarketDataViewModel> Items { get; set; }
}
public MarketDataUserControl(IMarketDataViewer viewModel)
{
InitializeComponent();
DataContext = viewModel;
marketDataTreeView.ItemsSource = viewModel.MarketDataItems;
}
当我更新我的 ViewModel 中的数据时,我只能在我的 Treeview 中看到第一层。我发现解决问题的唯一方法是在我的 ViewModel 中创建一个事件,当数据更新而不是调用 MarketDataItems 上的 PropertyChange 时,我触发了事件并像这样重置视图 marketDataTreeView.ItemsSource:
private void ViewModelOnOnUpdateItems()
{
marketDataTreeView.ItemsSource = null;
marketDataTreeView.ItemsSource = viewModel.MarketDataItems;
}
而且这项工作非常完美 --> 显示所有级别。
有人知道为什么 PropertyChange 不起作用以及为什么我必须重置 ItemsSource 吗?
我认为您应该实现对 ItemSource
的绑定,这是由 属性:
完成的
// Create property
public ObservableCollection<IMarketDataViewModel> MarketDataItems { get; private set; }
...
// Create Binding
Binding bindingObject = new Binding("MarketDataItems");
bindingObject.Source = this; //codebehind class instance which has MarketDataItems
marketDataTreeView.SetBinding(TreeView.ItemsSource, bindingObject);
或XAML中的绑定:
<TreeView x:Name="marketDataTreeView" ItemsSource="{Binding Path=MarketDataItems}"/>
最后的问题是我没有调用 OnPropertyChanged("Items")
public class MarketDataViewModelBase : IMarketDataViewModel, INotifyPropertyChanged
{
.....
private ObservableCollection<IMarketDataViewModel> items;
public ObservableCollection<IMarketDataViewModel> Items
{
get { return items; }
set
{
items = value;
OnPropertyChanged("Items"); //Add this line fix my issue
}
}
}
我创建了一个绑定到 ObservableCollection 的简单 Treeview。
ObservableCollection<IMarketDataViewModel> MarketDataItems;
public interface IMarketDataViewModel
{
string Title { get; }
ObservableCollection<IMarketDataViewModel> Items { get; set; }
}
public MarketDataUserControl(IMarketDataViewer viewModel)
{
InitializeComponent();
DataContext = viewModel;
marketDataTreeView.ItemsSource = viewModel.MarketDataItems;
}
当我更新我的 ViewModel 中的数据时,我只能在我的 Treeview 中看到第一层。我发现解决问题的唯一方法是在我的 ViewModel 中创建一个事件,当数据更新而不是调用 MarketDataItems 上的 PropertyChange 时,我触发了事件并像这样重置视图 marketDataTreeView.ItemsSource:
private void ViewModelOnOnUpdateItems()
{
marketDataTreeView.ItemsSource = null;
marketDataTreeView.ItemsSource = viewModel.MarketDataItems;
}
而且这项工作非常完美 --> 显示所有级别。
有人知道为什么 PropertyChange 不起作用以及为什么我必须重置 ItemsSource 吗?
我认为您应该实现对 ItemSource
的绑定,这是由 属性:
// Create property
public ObservableCollection<IMarketDataViewModel> MarketDataItems { get; private set; }
...
// Create Binding
Binding bindingObject = new Binding("MarketDataItems");
bindingObject.Source = this; //codebehind class instance which has MarketDataItems
marketDataTreeView.SetBinding(TreeView.ItemsSource, bindingObject);
或XAML中的绑定:
<TreeView x:Name="marketDataTreeView" ItemsSource="{Binding Path=MarketDataItems}"/>
最后的问题是我没有调用 OnPropertyChanged("Items")
public class MarketDataViewModelBase : IMarketDataViewModel, INotifyPropertyChanged
{
.....
private ObservableCollection<IMarketDataViewModel> items;
public ObservableCollection<IMarketDataViewModel> Items
{
get { return items; }
set
{
items = value;
OnPropertyChanged("Items"); //Add this line fix my issue
}
}
}