如何在绑定到选项卡控件时延迟加载视图模型属性?

时间:2016-09-20 04:42:12

标签: c# wpf mvvm tabs

我在我的WPF应用程序中使用MVVM在主/详细类型场景中我有一个搜索结果列表(主站)。当用户选择结果时,我调用Refresh并传递数据库密钥以加载详细信息。细节是具有一些复杂属性的视图模型。这些属性中的每一个都有一个项目列表(表示数据库中的数据)以及一些其他ICommands和属性。

我的视图有一个选项卡控件,其中每个选项卡显示其中一个复杂属性的数据。我只想加载复杂属性的列表(调用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不会被调用,直到&#34;历史项目&#34;选项卡已被选中。

但是如果我在ViewModel实例上调用Refresh,它会调用CurrentItems和HistoryItems上的Items getter,无论选择哪个选项卡。

基本上我想通过仅加载所需的数据来提高性能。在大多数情况下,用户将滚动搜索结果(调用ViewModel.Refresh)查看当前项目或历史记录。我只想在用户更改标签时加载两者。

有没有办法在我调用Refresh后,我只能根据选择的选项卡为CurrentItems或HistoryItems调用LoadItems?

1 个答案:

答案 0 :(得分:2)

IsSelected元素上有TabItem个属性。

在视图模型中创建两个bool属性。将相同的属性绑定到TabItem元素的IsSelected属性。

在所选标签的相应设置方法中调用LoadItems()

希望能解决您的问题: - )