【发布时间】:2016-09-20 04:42:11
【问题描述】:
我在我的 WPF 应用程序中使用 MVVM,在主/详细类型场景中,我有一个搜索结果列表(主)。当用户选择结果时,我调用 Refresh 并传递数据库密钥以加载详细信息。细节是具有一些复杂属性的视图模型。这些属性中的每一个都有一个项目列表(表示数据库中的数据)以及其他一些 ICommand 和属性。
我的视图有一个选项卡控件,其中每个选项卡显示这些复杂属性之一的数据。如果用于查看数据的选项卡项被选中(可见?),我只想加载复杂属性的列表(调用 LoadItems() 方法)。
这是一个简短的例子:
public class MyItem{
public string Id{get;set;}
public DateTime Timestamp{get;set;}
}
public class ComplexClass:INotifyPropertyChanged
{
private Guid _key;
private List<MyItem> _items;
public string Name{get;set;}
public List<MyItem> Items
{
get{
if (_items == null) LoadItems(_key);
return _items;
}
set{
if(Equals(value, _items) return;
_item = value;
OnPropertyChanged("Items");
}
}
public void LoadItems(Guid key){
... //code to load Items from database based on the key.
}
public ComplexClass(string name, Guid key){
Name = name;
_key = key;
}
}
public class MyViewModel:INotifyPropertyChanged
{
private ComplexClass _currentItems;
public ComplexClass CurrentItems
{
get{return _currentItems;}
set{
if(Equals(value, _currentItems) return;
_currentItem = value;
OnPropertyChanged("CurrentItems");
}
}
private ComplexClass _historyItems;
public ComplexClass HistoryItems
{
get{return _historyItems;}
set{
if(Equals(value, _historyItems) return;
_historyItems= value;
OnPropertyChanged("HistoryItems");
}
}
public void Refresh(Guid key){
CurrentItems = new ComplexClass("Foo", key);
HistoryItems = new ComplexClass("Bar", key);
}
}
这里是一些示例 XAML(假设 TabControl 的 DataContex 是 ViewModel 的一个实例)。
...
<TabControl>
<TabItem Header="Current Items"
DataContext={Binding CurrentItems}>
...
<ItemsControl ItemsSource={Binding Items}>
....
</ItemsControl>
</TabItem>
<TabItem Header="History Items"
DataContext={Binding HistoryItems}>
...
<ItemsControl ItemsSource={Binding Items}>
....
</ItemsControl>
</TabItem>
</TabControl>
这是第一次。在选择“历史项目”选项卡之前,不会调用 HistoryItems.Items Getter。
但是,如果我在 ViewModel 实例上调用 Refresh,它会在 CurrentItems 和 HistoryItems 上调用 Items getter,而不管选择了哪个选项卡。
基本上我想通过只加载所需的数据来提高性能。在大多数情况下,用户将滚动浏览搜索结果(调用 ViewModel.Refresh)查看当前项目或历史记录。如果用户更改标签,我只想加载两者。
有没有什么方法可以让我在调用 Refresh 后只能根据选择的选项卡为 CurrentItems 或 HistoryItems 调用 LoadItems?
【问题讨论】: