отложенная загрузка в TabControls (MVVM) - PullRequest
2 голосов
/ 21 января 2011

У меня есть TabControl, который отображает коллекцию моих ViewModels. Отображение между ViewModel и View реализовано с помощью DataTemplate. Я использую MVVM, но без ПРИЗМЫ (по историческим причинам). Базовый класс ViewModel имеет метод Load, который загружает информацию. Я хочу вызывать этот метод только тогда, когда выбран TabItem, соответствующий текущей ViewModel (отложенная загрузка). Есть идеи? PS Я нашел ответы на похожий вопрос - Ленивая загрузка содержимого вкладки WPF , но я не понимаю, как использовать подход 2 в MVVM.

Ответы [ 2 ]

12 голосов
/ 21 января 2011

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;
}
5 голосов
/ 11 сентября 2012

Другой способ. Это в основном имитирует событие SelectedTabChanged в MVVM.

Он работает, связывая свойство Name вкладки со свойством SelectedTabName в модели представления, с которым вы можете делать все, что захотите (включая предотвращение изменения вкладки, устанавливая значение обратно в предыдущее значение).

ViewModel

    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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...