我有一个TabControl,显示我的ViewModel的集合.ViewModel和View之间的映射由DataTemplate实现.我使用MVVM但没有PRISM(由于历史原因).ViewModel的Base类有一个Load加载信息的方法.我想要做的是仅在选择与当前ViewModel相对应的TabItem(延迟加载)时调用此方法.有任何想法吗?PS我找到了类似问题的答案 - 懒惰加载WPF标签内容 但我无法理解如何在MVVM中使用方法2.
Mar*_*nov 12
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>
Run Code Online (Sandbox Code Playgroud)
样品型号:
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;
}
Run Code Online (Sandbox Code Playgroud)
其他方式.这基本上模拟了SelectedTabChangedMVVM中的事件.
它的工作原理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();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
XAML
<TabControl SelectedValuePath="Name" SelectedValue="{Binding SelectedTabName}">
<TabItem Header="Events" Name="EVENTS">
...
</TabItem>
<TabItem Header="Messages" Name="MESSAGES">
...
</TabItem>
</TabControl>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7351 次 |
| 最近记录: |