【问题标题】:lazy loading in TabControls (MVVM)TabControls (MVVM) 中的延迟加载
【发布时间】:2011-01-21 08:07:39
【问题描述】:

我有一个 TabControl,它显示了我的 ViewModel 的集合。 ViewModel 和 View 之间的映射由 DataTemplate 实现。我使用 MVVM 但没有 PRISM(出于历史原因)。 ViewModel 的 Base 类有一个方法 Load 来加载信息。我要做的是仅在选择与当前 ViewModel 对应的 TabItem 时调用此方法(延迟加载)。有任何想法吗? PS 我找到了类似问题的答案 - Lazy loading WPF tab content 但我不明白如何在 MVVM 中使用方法 2。

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

    TabItem 与任何 Selector 项一样具有 IsSelected 属性。您可以尝试使用双向绑定将其与视图模型绑定。当模型的 IsSelected 首次设置为 true 时,您可以加载数据。

    XAML:

    <TabControl ...>
        <TabControl.ItemContainerStyle>
            <Style TargetType="{x:Type TabItem}">
                <Setter Property="IsSelected"
                        Value="{Binding Path=IsSelected,Mode=TwoWay}"/>
            </Style>
        </TabControl.ItemContainerStyle>
    </TabControl>
    

    示例模型:

    public class MyViewModel : INotifyPropertyChanged
    {
        private bool _isLoaded;
    
        private void Load()
        {
            // code
        }
    
        private bool _isSelected;
    
        public bool IsSelected
        {
            get
            {
                return this._isSelected;
            }
            set
            {
                if (this._isSelected != value)
                {
                    this._isSelected = value;
    
                    if (this._isSelected && !this._isLoaded)
                    {
                        this.Load();
                        this._isLoaded = true;
                    }
    
                    var propertyChanged = this.PropertyChanged;
                    if (propertyChanged != null)
                    {
                        propertyChanged(this, new PropertyChangedEventArgs("IsSelected"));
                    }
                }
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    }
    

    【讨论】:

    • 1.我不明白如何使用 IsSelected 属性 - 我只有 TabControl 和 UserControls 显示在其中。所以我没有明确的 TabItems 也不知道如何获取它们。
    • 2.如果我什至有 TabItem,我无法理解如何 IsSelected 属性可以帮助我。我在哪里可以检查 IsSelectedIsTrueForThe1stTime 然后调用我的 Load 方法?
    • 我在回答中添加了示例
    【解决方案2】:

    另一种方式。这基本上是在 MVVM 中模拟 SelectedTabChanged 事件。

    它通过将选项卡的Name 属性绑定到视图模型中的SelectedTabName 属性来工作,您可以对其进行任何操作(包括通过将值设置回其先前值来防止选项卡更改)。

    视图模型

        public string _selectedTabName;
        public string SelectedTabName
        {
            get { return _selectedTabName; }
            set
            {
                if (_selectedTabName != value)
                {
                    _selectedTabName = value;
                    RaisePropertyChanged("SelectedTabName");
    
                    if (SelectedTabName == "EVENTS" && EventsLoaded == false)
                    {
                        LoadEvents();
                    }
    
                    if (SelectedTabName == "MESSAGES" && MessagesLoaded == false)
                    {
                        LoadMessages();
                    }
                }
            }
        }
    

    XAML

     <TabControl SelectedValuePath="Name" SelectedValue="{Binding SelectedTabName}">
         <TabItem Header="Events" Name="EVENTS">
             ...
         </TabItem>
         <TabItem Header="Messages" Name="MESSAGES">
             ...
         </TabItem>
      </TabControl>
    

    【讨论】:

      猜你喜欢
      • 2013-07-16
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-22
      • 2011-03-14
      • 1970-01-01
      相关资源
      最近更新 更多